initial
This commit is contained in:
29
src/parse.ml
Normal file
29
src/parse.ml
Normal file
@@ -0,0 +1,29 @@
|
||||
let parse stm g =
|
||||
let s = (Token.new_scanner stm) in
|
||||
try
|
||||
Token.program s g
|
||||
with End_of_file ->
|
||||
Token.syntax_error s "program reached end of file before end keyword"
|
||||
|
||||
let program s g =
|
||||
if Token.match_token s Token.Begin then
|
||||
let _ = generate_begin s g in
|
||||
let _ = statements s g in
|
||||
if Token.match_token s Token.End then
|
||||
let _ = generate_end s g in ()
|
||||
else Token.syntax_error s "program should end with end keyword"
|
||||
else Token.syntax_error s "program should start with begin keyword"
|
||||
|
||||
let rec statements s g = if statement s g then statements s g else ()
|
||||
|
||||
let statement s g =
|
||||
let t = next_token s in
|
||||
if match t with
|
||||
| Token.Read -> read s g
|
||||
| Token.Write -> write s g
|
||||
| Token.Identifier i -> assignment s g
|
||||
| _ -> false
|
||||
then
|
||||
if Token.match_token s Token.Semicolon then true
|
||||
else Token.syntax_error s "statement must end with semicolon"
|
||||
else false
|
Reference in New Issue
Block a user