summaryrefslogtreecommitdiff
path: root/grammar/go/insert-semi.lm
diff options
context:
space:
mode:
Diffstat (limited to 'grammar/go/insert-semi.lm')
-rw-r--r--grammar/go/insert-semi.lm111
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 )
+}