summaryrefslogtreecommitdiff
path: root/godel/grammar.peg
blob: 1096b006e8b3a19aaae09ccdfb17fb652cc6fb36 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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]* {  }