summary refs log tree commit diff
path: root/source
diff options
context:
space:
mode:
authorPaweł Dybiec <pdybiec@stud.cs.uni.wroc.pl>2018-11-04 13:21:36 +0100
committerPaweł Dybiec <pdybiec@stud.cs.uni.wroc.pl>2018-11-04 13:21:36 +0100
commit86d0833fb238bcb63968e677d645f896da74fbc5 (patch)
tree083ce1d6c43260250b92ca11938077de99578930 /source
parentAdd basic tokens + parse function name (diff)
parse function arguments
Diffstat (limited to 'source')
-rw-r--r--source/mod_student/lexer.mll83
-rw-r--r--source/mod_student/parser.mly22
2 files changed, 51 insertions, 54 deletions
diff --git a/source/mod_student/lexer.mll b/source/mod_student/lexer.mll
index a62b8ad..806cfb8 100644
--- a/source/mod_student/lexer.mll
+++ b/source/mod_student/lexer.mll
@@ -31,6 +31,7 @@
    *)
 
   let identifier    = ['a'-'z' '_' 'A' - 'Z']['_' 'A' - 'Z' 'a'-'z' '0'-'9']*
+  let integer       = ['0'-'9']*
   
   (* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      ----------------------------------------------------------------------------- *)
@@ -54,60 +55,40 @@
       (* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv 
        * Miejsce na twoje reguły
        *)
-      | "("
-      { LPAREN }
-      | ")"
-      { RPAREN }
-      | "{"
-      { LBRACKET }
-      | "{"
-      { RBRACKET }
-      | ":"
-      { COLON }
-      | "+"
-      { OP_PLUS }
-      | "-"
-      { OP_MINUS }
-      | "*"
-      { OP_MULT }
-      | "/"
-      { OP_DIV }
-      | "%"
-      { OP_REM }
-      | "&"
-      { OP_AND }
-      | "|"
-      { OP_OR }
-      | "=="
-      { OP_EQ }
-      | "!="
-      { OP_NEQ }
-      | "<="
-      { OP_LE }
-      | ">="
-      { OP_GE }
-      | "<"
-      { OP_LT }
-      | ">"
-      { OP_GT }
-      | "="
-      { ASSIGN }
-      | "if"
-      { IF }
-      | "else"
-      { ELSE }
-      | "while"
-      { WHILE }
-      | "return"
-      { RETURN }
-      | "length"
-      { LENGTH }
-      | identifier as id
-      { IDENTIFIER id }
+      | "("       { LPAREN }
+      | ")"       { RPAREN }
+      | "{"       { LBRACKET }
+      | "{"       { RBRACKET }
+      | "["       { LSBRACKET }
+      | "]"       { RSBRACKET }
+      | ":"       { COLON }
+      | "+"       { OP_PLUS }
+      | "-"       { OP_MINUS }
+      | "*"       { OP_MULT }
+      | "/"       { OP_DIV }
+      | "%"       { OP_REM }
+      | "&"       { OP_AND }
+      | "|"       { OP_OR }
+      | "=="      { OP_EQ }
+      | "!="      { OP_NEQ }
+      | "<="      { OP_LE }
+      | ">="      { OP_GE }
+      | "<"       { OP_LT }
+      | ">"       { OP_GT }
+      | "="       { ASSIGN }
+      | "if"      { IF }
+      | "else"    { ELSE }
+      | "while"   { WHILE }
+      | "return"  { RETURN }
+      | "length"  { LENGTH }
+      | "int"     { T_INT }
+      | "bool"    { T_BOOL }
+      | identifier as id  { IDENTIFIER id }
+      | integer as i      { INT (int_of_string i) }
 
       (* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          ----------------------------------------------------------------------------- *)
-  
+      | " " {token lexbuf}
       | _
       { handleError (Lexing.lexeme_start_p lexbuf) (Lexing.lexeme lexbuf) }
 
diff --git a/source/mod_student/parser.mly b/source/mod_student/parser.mly
index 4889d11..0fb4ee0 100644
--- a/source/mod_student/parser.mly
+++ b/source/mod_student/parser.mly
@@ -34,6 +34,8 @@ let mkTag =
 %token RPAREN
 %token LBRACKET
 %token RBRACKET
+%token LSBRACKET
+%token RSBRACKET
 %token COLON
 %token OP_PLUS
 %token OP_MINUS
@@ -58,6 +60,8 @@ let mkTag =
 %token <string>IDENTIFIER
 %token <char>CHAR
 %token <bool>BOOL
+%token T_BOOL
+%token T_INT
 
 (* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ----------------------------------------------------------------------------- *)
@@ -77,11 +81,23 @@ file:
     { ModuleDefinition {global_declarations=[] } }
 
 func:
-    | id=identifier LPAREN RPAREN 
+    | id=identifier LPAREN parameters=list(argument) RPAREN 
     { GDECL_Function { loc=Location( {line=0;column=0;file=""});
-    id=id;formal_parameters=[]; return_types=[];body=None} }
+    id=id;formal_parameters=parameters; return_types=[];body=None} }
+argument:
+    | id = identifier COLON t=typ 
+    { VarDecl {loc=mkLocation $startpos;id=id;tp=t} }
+typ:
+    | t=base_type { t }
+    | t=typ LSBRACKET option(INT) RSBRACKET 
+      { TEXPR_Array { loc=mkLocation $startpos;
+        sub=t;dim=None } }
+base_type:
+    | T_INT  {TEXPR_Int {loc=mkLocation $startpos}}
+    | T_BOOL {TEXPR_Bool {loc=mkLocation $startpos}}
+
 identifier:
-    | IDENTIFIER
+    |  IDENTIFIER
     { Identifier $1 }
 
 (*