diff graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/SimpleLanguage.atg @ 12752:71991b7a0f14

SL: Enhanced SimpleLanguage with support for if statements, function calls, function caching + inlining and builtins.
author Christian Humer <christian.humer@gmail.com>
date Mon, 11 Nov 2013 21:34:44 +0100
parents b6a87711eca0
children 7c418666c6c9
line wrap: on
line diff
--- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/SimpleLanguage.atg	Thu Nov 07 20:55:13 2013 +0100
+++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/SimpleLanguage.atg	Mon Nov 11 21:34:44 2013 +0100
@@ -35,8 +35,12 @@
 Function
 =
 "function"                                      (. factory.startFunction(); .)
-identifier                                      (. String name = t.val; .)
-Block<out StatementNode body>                   (. factory.createFunction(body, name); .)
+identifier                                      (. String name = t.val; 
+                                                   List<String> parameterNames = new ArrayList<>(); .)
+["(" [identifier                                (. parameterNames.add(t.val); .)
+] {"," identifier                               (. parameterNames.add(t.val); .)
+} ")"]
+Block<out StatementNode body>                   (. factory.createFunction(body, name, parameterNames.toArray(new String[parameterNames.size()])); .)
 .
 
 Block<out StatementNode result>
@@ -52,15 +56,22 @@
 =                                               (. result = null; .)
 (
     WhileStatement<out result>
-|
-    AssignmentStatement<out result>
-|
-    OutputStatement<out result>
+|   
+    IfStatement<out result>
 |
     ReturnStatement<out result>
+|
+    Expression<out result> ";"
 )
 .
 
+IfStatement<out StatementNode result>
+=
+"if" "(" Expression<out ConditionNode condition> ")"  (. StatementNode thenNode = null; StatementNode elseNode = null; .)
+Block<out thenNode>                             
+["else" Block<out elseNode>]                    (. result = factory.createIf(condition, thenNode, elseNode); .)
+.
+
 WhileStatement<out StatementNode result>
 =
 "while"
@@ -70,22 +81,6 @@
 Block<out StatementNode body>                   (. result = factory.createWhile(condition, body); .)
 .
 
-AssignmentStatement<out StatementNode result>
-=
-identifier                                      (. String name = t.val; .)
-"="
-Expression<out TypedNode rvalue>
-";"                                             (. result = factory.createAssignment(name, rvalue); .)
-.
-
-OutputStatement<out StatementNode result>
-=                                               (. List<TypedNode> expressions = new ArrayList<>(); .)
-"print"
-{
-    Expression<out TypedNode value>             (. expressions.add(value); .)
-}
-";"                                             (. result = factory.createPrint(expressions); .)
-.
 
 ReturnStatement<out StatementNode result>
 =
@@ -123,15 +118,13 @@
 Factor<out TypedNode result>
 =                                               (. result = null; .)
 (
-    TimeRef<out result>
-|
-    VariableRef<out result>
+    VariableRefOrCall<out result>
 |
     StringLiteral<out result>
 |
     NumericLiteral<out result>
 |
-    Ternary<out result>  
+    Ternary<out result>
 |
     "(" Expression<out result> ")"
 ) 
@@ -143,9 +136,23 @@
                                                 (. result = factory.createTernary(condition, thenPart, elsePart); .)
 .
 
-TimeRef<out TypedNode result> 
+VariableRefOrCall<out TypedNode result> 
 =
-"time"                                          (. result = factory.createTime(); .)
+VariableRef<out result>                  
+[
+  (Parameters<out TypedNode[] parameters>)      (. result = factory.createCall(result, parameters); .)
+| ("=" Expression<out TypedNode assignment>)    (. result = factory.createAssignment(result, assignment); .)
+]
+.
+
+Parameters<out TypedNode[] result> 
+=      
+"("                                         (. List<TypedNode> parameters = new ArrayList<>(); .)
+[Expression<out TypedNode e1>                   (. parameters.add(e1); .)
+{"," Expression<out TypedNode e2>               (. parameters.add(e2); .)
+}                                               
+]                                           (. result = parameters.toArray(new TypedNode[parameters.size()]); .) 
+")"
 .
 
 VariableRef<out TypedNode result>