Work on expressions.

This commit is contained in:
Jesse Brault 2025-09-07 16:37:00 -05:00
parent 3f534bf7fd
commit 3f3df59761
2 changed files with 238 additions and 52 deletions

View File

@ -441,3 +441,161 @@ ForStatement:
- end_kw:
rule: End
vec: true
# Expressions
Expression:
children:
- ternary_expression
TernaryExpression:
children:
- or_expression
- ternary_alternatives:
optional: true
TernaryAlternatives:
children:
- ternary_true_alternative
- ternary_false_alternative
TernaryTrueAlternative:
children:
- expression
TernaryFalseAlternative:
children:
- expression
OrExpression:
children:
- left:
rule: AndExpression
- or_sym:
rule: Or
skip: true
- right:
rule: Expression
optional: true
AndExpression:
children:
- left:
rule: ComparisonExpression
- and_sym:
rule: And
skip: true
- right:
rule: Expression
optional: true
ComparisonExpression:
children:
- left:
rule: ShiftExpression
- operator:
rule: ComparisonOperator
optional: true
- right:
rule: Expression
optional: true
ComparisonOperator:
rules:
- Greater
- Less
- GreaterEqual
- LessEqual
- EqualTo
- NotEqualTo
ShiftExpression:
children:
- left:
rule: AdditiveExpression
- operator:
rule: ShiftOperator
optional: true
- right:
rule: Expression
ShiftOperator:
rules:
- LeftShift
- RightShift
AdditiveExpression:
children:
- left:
rule: MultiplicativeExpression
- operator:
rule: AdditiveOperator
optional: true
- right:
rule: Expression
optional: true
MultiplicativeExpression:
children:
- left:
rule: PrefixExpression
- operator:
rule: MultiplicativeOperator
optional: true
- right:
rule: Expression
MultiplicativeOperator:
type: leaf_enum
rules:
- Multiply
- Divide
- Modulo
PrefixExpression:
children:
- operators:
rule: PrefixOperator
vec: true
PrefixOperator:
type: leaf_enum
rules:
- Spread
- Not
- Negative
SuffixExpression:
children:
- left:
rule: PrimaryExpression
- operators:
rule: SuffixOperator
vec: true
SuffixOperator:
type: leaf_enum
rules:
- PlusPlus
- MinusMinus
- ObjectProperty:
child: true
- ObjectIndex:
child: true
- Call:
child: true
ObjectProperty:
children:
- identifier
ObjectIndex:
children:
- expression
PrimaryExpression:
rules:
- Literal
- FullyQualifiedName
- Closure
- ParenthesizedExpression
ParenthesizedExpression:
children:
- expression
# Calls
Call:
children:
- turbo_fish:
optional: true
- expression_list:
optional: true
- closure:
optional: true
TurboFish:
children:
- generic_arguments
ExpressionList:
children:
- expressions:
rule: Expression
vec: true

View File

@ -81,6 +81,10 @@ Keyword = {
| True
| False
| Use
| Then
| Do
| End
| Companion
| Byte
| Short
| Char
@ -627,12 +631,22 @@ Expression = {
TernaryExpression = {
OrExpression
~ (
~ ( TernaryAlternatives )?
}
TernaryAlternatives = {
TernaryTrueAlternative
~ TernaryFalseAlternative
}
TernaryTrueAlternative = {
"?"
~ Expression
~ ":"
}
TernaryFalseAlternative = {
":"
~ Expression
)?
}
OrExpression = {
@ -648,52 +662,93 @@ AndExpression = {
ComparisonExpression = {
ShiftExpression
~ (
( Greater | Less | GreaterEqual | LessEqual | EqualTo | NotEqualTo )
ComparisonOperator
~ Expression
)?
}
ComparisonOperator = {
Greater
| Less
| GreaterEqual
| LessEqual
| EqualTo
| NotEqualTo
}
ShiftExpression = {
AdditiveExpression
~ ( ( LeftShift | RightShift ) ~ Expression )?
~ (
ShiftOperator
~ Expression
)?
}
ShiftOperator = {
LeftShift
| RightShift
}
AdditiveExpression = {
MultiplicativeExpression
~ (
( Add | Subtract )
AdditiveOperator
~ Expression
)?
}
AdditiveOperator = {
Add
| Subtract
}
MultiplicativeExpression = {
PrefixExpression
~ (
( Multiply | Divide | Modulo )
MultiplicativeOperator
~ Expression
)?
}
MultiplicativeOperator = {
Multiply
| Divide
| Modulo
}
PrefixExpression = {
(
PrefixOperator*
~ SuffixExpression
}
PrefixOperator = {
Spread
| BorrowMut
| Borrow
| Mut
| Not
| Negative
)*
~ SuffixExpression
}
SuffixExpression = {
PrimaryExpression
~ (
ObjectAccess
| ParenthesesCall
| PlusPlus
~ SuffixOperator*
}
SuffixOperator = {
PlusPlus
| MinusMinus
)*
| ObjectProperty
| ObjectIndex
| Call
}
ObjectProperty = {
"."
~ Identifier
}
ObjectIndex = {
"["
~ Expression
~ "]"
}
PrimaryExpression = {
@ -709,36 +764,9 @@ ParenthesizedExpression = {
~ ")"
}
ObjectAccess = {
( ObjectProperty | ObjectIndex )+
}
ObjectProperty = {
"."
~ Identifier
}
ObjectIndex = {
"["
~ Expression
~ "]"
}
// Calls
CallExpression = {
PrimaryExpression
~ ObjectAccess?
~ ParenthesesCall
~ (
ObjectAccess
| ParenthesesCall
| PlusPlus
| MinusMinus
)*
}
ParenthesesCall = {
Call = {
TurboFish?
~ "("
~ ExpressionList?