summaryrefslogtreecommitdiff
path: root/src/parser/grammar.pegjs
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser/grammar.pegjs')
-rw-r--r--src/parser/grammar.pegjs62
1 files changed, 39 insertions, 23 deletions
diff --git a/src/parser/grammar.pegjs b/src/parser/grammar.pegjs
index 0017b18..229c922 100644
--- a/src/parser/grammar.pegjs
+++ b/src/parser/grammar.pegjs
@@ -17,11 +17,11 @@ SelectExpression
_?
LPAREN
_?
- record:Integer
+ index:Integer
_?
COMMA
_?
- val:Value
+ record:VarStatement
_?
COMMA
_?
@@ -31,7 +31,7 @@ SelectExpression
_?
continuation:ContinuationExpression
_?
- RPAREN { return { select: { record, val, bind, continuation } }; }
+ RPAREN { return { select: { index, record, bind, continuation } }; }
OffsetExpression
= OFFSET
@@ -86,9 +86,17 @@ SwitchExpression
RPAREN { return { switch: { switchIndex, continuations } }; }
ApplicationExpression
- = APP _? LPAREN _? fn:(LabelStatement / VarStatement) _? COMMA _? args:ValueList _? RPAREN {
- return { application: { fn, args } };
- }
+ = APP
+ _?
+ LPAREN
+ _?
+ fn:(LabelStatement / VarStatement)
+ _?
+ COMMA
+ _?
+ args:ValueList
+ _?
+ RPAREN { return { application: { fn, args } }; }
FixBinding
= LPAREN
@@ -169,16 +177,29 @@ PrimitiveOperationExpression
};
}
-RecordExpressionTuple
- = LPAREN
+AccessPath
+ = OffsetPath
+ / SelectPath
+
+OffsetPath = OFFP _ offset:Integer { return { offset: offset.int }; }
+
+SelectPath
+ = SELP
+ _?
+ LPAREN
_?
- value:Value
+ index:Integer
_?
COMMA
_?
- offset:OffsetStatement
+ accessPath:AccessPath
_?
- RPAREN { return { value, offset }; }
+ RPAREN { return { select: { index, accessPath } }; }
+
+RecordExpressionTuple
+ = LPAREN _? value:Value _? COMMA _? accessPath:AccessPath _? RPAREN {
+ return { value, accessPath };
+ }
RecordExpressionTupleList
= LBRACKET
@@ -238,14 +259,6 @@ BoolStatement = BOOL _ bool:Integer { return { bool: bool.int }; }
StringStatement = STRING _ string:QuotedString { return string; }
-AccessStatement
- = OffsetStatement
- / SelectStatement
-
-OffsetStatement = OFFP _ offset:Integer { return offset; }
-
-SelectStatement = SELP _ offset:Integer { return offset; }
-
Identifier
= name:([A-Za-z] (LETTER / DIGIT / SAFE_SYMBOL)*) {
return { name: name[0] + name[1].join('') };
@@ -291,7 +304,8 @@ ComparisonOperation
/ "||"
/ "&&"
-Integer = digits:("-"? [0-9]+) !"." { return { int: parseInt(digits.join(''), 10) }; }
+Integer
+ = digits:("-"? [0-9]+) !"." { return { int: parseInt(digits.join(''), 10) }; }
QuotedString
= "'" content:[^']* "'" { return content.join(''); }
@@ -299,9 +313,11 @@ QuotedString
Real
= value:("-"? [0-9]+ ("." [0-9]+)?) {
- return { real: parseFloat(
- value.map(x => (Array.isArray(x) ? x.join('') : x)).join(''),
- ) };
+ return {
+ real: parseFloat(
+ value.map(x => (Array.isArray(x) ? x.join('') : x)).join(''),
+ ),
+ };
}
Literal