diff options
Diffstat (limited to 'grammar/go/insert-semi.lm')
-rw-r--r-- | grammar/go/insert-semi.lm | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/grammar/go/insert-semi.lm b/grammar/go/insert-semi.lm new file mode 100644 index 00000000..3271216a --- /dev/null +++ b/grammar/go/insert-semi.lm @@ -0,0 +1,111 @@ +lex + literal `var `if `then `else `while `do `for `read `write + `end `to `goto + + literal `:= `!= `+ `- `* `/ `= `( `) `: `; + + ignore /'//' [^\n]* '\n'/ + ignore /[\n\t ]+/ + + token id /[a-zA-Z_]+/ + token integer /[0-9]+/ + token stringlit /'"' [^"]* '"'/ + + token insert_semi / + ( ( id - + 'var' - 'if' - 'then' - 'else' - 'while' - + 'do' - 'for' - 'read' - 'write' - 'end' - + 'to' - 'goto' ) | + integer | stringlit | ')' ) '\n' / + { + Prefix: str = input->pull( match_length - 1 ) + input->push( ";" ) + input->push( Prefix ) + } + +end + +def program + [statement*] + +def statement + [declaration] +| [assignment_statement] +| [if_statement] +| [while_statement] +| [do_statement] +| [for_statement] +| [read_statement] +| [write_statement] +| [labelled_statement] +| [goto_statement] + +def declaration + [`var id `;] + +def assignment_statement + [id `:= expression `;] + +def if_statement + [`if expression `then statement* opt_else_statement `end] + +def opt_else_statement + [`else statement*] +| [] + +def while_statement + [`while expression `do statement* `end] + +def do_statement + [`do statement* `while expression `;] + +def for_statement + [`for id `:= expression `to expression `do statement* `end] + +def read_statement + [`read id `;] + +def write_statement + [`write expression `;] + +def expression + [term] +| [expression eqop term] + +def eqop [`=] | [`!=] + +def term + [factor] +| [term addop factor] + +def addop [`+] | [`-] + +def factor + [primary] +| [factor mulop primary] + +def mulop [`*] | [`/] + +def primary + [id] +| [lit] +| [`( expression `)] + +def lit + [integer] +| [stringlit] + +def labelled_statement + [id `: statement] + +def goto_statement + [`goto id `;] + +parse P: program[stdin] + +if P + print[ P ] +else { + print "[error] + exit( 1 ) +} |