From ec2b924fdac0b609c2bda4e857113674965732af Mon Sep 17 00:00:00 2001 From: Elizabeth Hunt Date: Thu, 16 Nov 2023 14:56:56 -0700 Subject: godel init foo --- godel/grammar.peg | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 godel/grammar.peg (limited to 'godel/grammar.peg') diff --git a/godel/grammar.peg b/godel/grammar.peg new file mode 100644 index 0000000..1096b00 --- /dev/null +++ b/godel/grammar.peg @@ -0,0 +1,48 @@ +Program = instructions: Line* { + return { instructions: instructions }; +} + +Line = instruction: (LabeledInstruction / Instruction) _ { + return instruction; +} + +LabeledInstruction = label:Label _ instruction:Instruction { + return { label, instruction }; +} + +Label = "[" _? label:LABEL_V _? "]" { + return label; +} + +Instruction = conditional: Conditional { return { conditional }; } + / assignment: Assignment { return { assignment }; } + +Conditional = "IF" _ variable: VAR _ "!=" _ "0" _ "GOTO" _ label: Label { + return { variable, label }; +} + +Assignment = variable: VAR _ "<-" _ expr: Expression { + if (expr.left != variable) { + error("left hand variable must match right hand"); + } + return { variable, expr }; +} + +Expression = left: VAR _ opr: OPERATION _ "1" { + return { left, opr }; +} + +VAR = symbol:"Y" { return symbol } / symbol:("X" / "Z") ind:Integer+ { + return symbol + ind; +} + +OPERATION = "+" / "-" + +LABEL_V = symbol:[A-E] ind:Integer+ { + return symbol + ind; +} + +Integer "integer" + = _ [0-9]+ { return parseInt(text(), 10); } + +_ "whitespace" = [ \t\n\r]* { } -- cgit v1.2.3-70-g09d2