Compare commits

...

2 Commits

2 changed files with 23 additions and 4 deletions

View File

@ -1,19 +1,22 @@
@precedence { @precedence {
annotation annotation
typeCall
member member
call call
exp @left exp @left
mult @left mult @left
add @left add @left
ascription @left
comp @left comp @left
logic @left logic @left
pipe @left pipe @left
range range
statement
} }
@top Program { @top Program {
Shebang? Shebang?
statement* (statement !statement statement*)?
} }
statement[@isGroup=Statement] { statement[@isGroup=Statement] {
@ -52,12 +55,15 @@ expression[@isGroup=Expression] {
UnaryExpression { UnaryOp expression } | UnaryExpression { UnaryOp expression } |
ParenthesizedExpression { "(" expression ")" } | ParenthesizedExpression { "(" expression ")" } |
IfExpression { kw<"if"> expression Body kw<"else"> Body } | IfExpression { kw<"if"> expression Body kw<"else"> Body } |
CallExpression { expression !call ArgumentList } | // We don't currently support arbitrary expressions as the callee part of a
// function call.
CallExpression { identifier !call ArgumentList } |
ArrayExpression { "[" commaSep<expression | IntegerRange { expression !range ".." expression }> "]" } | ArrayExpression { "[" commaSep<expression | IntegerRange { expression !range ".." expression }> "]" } |
ObjectExpression { "{" commaSep<ObjectProperty> "}" } | ObjectExpression { "{" commaSep<ObjectProperty> "}" } |
MemberExpression { expression !member "." PropertyName } | MemberExpression { expression !member "." PropertyName } |
SubscriptExpression { expression !member "[" expression "]" } | SubscriptExpression { expression !member "[" expression "]" } |
PipeExpression { expression (!pipe PipeOperator expression)+ } PipeExpression { expression (!pipe PipeOperator expression)+ } |
AscribedExpression { expression !ascription ":" type }
} }
UnaryOp { AddOp | BangOp } UnaryOp { AddOp | BangOp }
@ -75,7 +81,7 @@ LabeledArgument { ArgumentLabel Equals expression }
ArgumentList { "(" commaSep<LabeledArgument | expression> ")" } ArgumentList { "(" commaSep<LabeledArgument | expression> ")" }
type[@isGroup=Type] { type[@isGroup=Type] {
PrimitiveType { identifier } | PrimitiveType { identifier !typeCall ("(" identifier ")")? } |
ArrayType { "[" type !member (";" Number "+"?)? "]" } | ArrayType { "[" type !member (";" Number "+"?)? "]" } |
ObjectType { "{" commaSep<ObjectProperty { PropertyName ":" type }> "}" } ObjectType { "{" commaSep<ObjectProperty { PropertyName ":" type }> "}" }
} }

View File

@ -0,0 +1,13 @@
# primitive
true: bool
==>
Program(ExpressionStatement(AscribedExpression(true, ":", PrimitiveType)))
# numeric units
3.5: number(mm)
==>
Program(ExpressionStatement(AscribedExpression(3.5, ":", PrimitiveType)))