2024-12-23 01:42:58 +08:00
|
|
|
@top Program {
|
2024-12-20 20:20:34 +08:00
|
|
|
StatementList
|
|
|
|
}
|
|
|
|
|
|
|
|
StatementList {
|
|
|
|
Statement*
|
|
|
|
}
|
|
|
|
|
|
|
|
@skip { Whitespace }
|
|
|
|
|
|
|
|
IfStatement {
|
|
|
|
If LParen ConditionalExpression RParen PartIfStatement Else Statement | If LParen ConditionalExpression RParen Statement
|
|
|
|
}
|
|
|
|
|
|
|
|
PartIfStatement {
|
|
|
|
If LParen ConditionalExpression RParen PartIfStatement Else PartIfStatement | NoIfStatement
|
|
|
|
}
|
|
|
|
|
|
|
|
ConditionalExpression {
|
|
|
|
Expression Operator Expression | Expression
|
|
|
|
}
|
|
|
|
|
|
|
|
Expression {
|
|
|
|
Term (AddLike Term)*
|
|
|
|
}
|
|
|
|
|
|
|
|
Statement {
|
|
|
|
IfStatement | NoIfStatement
|
|
|
|
}
|
|
|
|
|
|
|
|
NoIfStatement {
|
2024-12-23 01:42:58 +08:00
|
|
|
AssignmentStatement Semicolon | VariableDefinition Semicolon | LBrace Statement* RBrace | ConstantDefinition Semicolon | Semicolon
|
2024-12-20 20:20:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
AssignmentStatement {
|
|
|
|
Identifier Equal Expression
|
|
|
|
}
|
|
|
|
|
|
|
|
Term {
|
|
|
|
Factor (MultiplyLike Factor)*
|
|
|
|
}
|
|
|
|
|
|
|
|
ConstantDefinition {
|
|
|
|
Const VariableDefinition
|
|
|
|
}
|
|
|
|
|
2024-12-23 01:42:58 +08:00
|
|
|
VariableDefinition {
|
|
|
|
Type (Identifier | AssignmentStatement)+ (Comma Identifier | Comma AssignmentStatement)*
|
|
|
|
}
|
|
|
|
|
2024-12-20 20:20:34 +08:00
|
|
|
Type {
|
|
|
|
Int | Char
|
|
|
|
}
|
|
|
|
|
|
|
|
Factor {
|
|
|
|
Identifier | Number | Character | LParen Expression RParen
|
|
|
|
}
|
|
|
|
|
|
|
|
AddLike {
|
|
|
|
Plus | Minus
|
|
|
|
}
|
|
|
|
|
|
|
|
MultiplyLike {
|
|
|
|
Multiply | Divide | Modulo
|
|
|
|
}
|
|
|
|
|
|
|
|
Number {
|
|
|
|
UnsignedNumber | Minus UnsignedNumber | Plus UnsignedNumber
|
|
|
|
}
|
2024-12-23 01:42:58 +08:00
|
|
|
|
|
|
|
Operator {
|
|
|
|
EuqalTo | NotEqualTo | LessThan | GreaterThan | LessThanOrEqual | GreaterThanOrEqual
|
|
|
|
}
|
|
|
|
|
2024-12-20 20:20:34 +08:00
|
|
|
@tokens {
|
|
|
|
If { "!if" }
|
|
|
|
Else { "!else" }
|
|
|
|
Int {"!int"}
|
|
|
|
Char {"!char"}
|
|
|
|
Const { "!const" }
|
|
|
|
Plus { "+" }
|
|
|
|
Minus { "-" }
|
|
|
|
Multiply { "*" }
|
|
|
|
Modulo { "%" }
|
|
|
|
Divide { "/" }
|
|
|
|
LParen { "(" }
|
|
|
|
RParen { ")" }
|
|
|
|
LBrace { "{" }
|
|
|
|
RBrace { "}" }
|
2024-12-23 01:42:58 +08:00
|
|
|
Comma { "," }
|
2024-12-20 20:20:34 +08:00
|
|
|
Semicolon { ";" }
|
|
|
|
Identifier { $[a-zA-Z_]$[a-zA-Z0-9_]* }
|
|
|
|
UnsignedNumber { $[0-9]+ }
|
|
|
|
String { "\"" $[\x00-\x7F]* "\"" }
|
|
|
|
Character { "'" $[\x00-\x7F] "'" }
|
2024-12-23 01:42:58 +08:00
|
|
|
EuqalTo { "==" }
|
|
|
|
NotEqualTo { "!=" }
|
|
|
|
LessThan { "<" }
|
|
|
|
GreaterThan { ">" }
|
|
|
|
LessThanOrEqual { "<=" }
|
|
|
|
GreaterThanOrEqual { ">=" }
|
2024-12-20 20:20:34 +08:00
|
|
|
Equal { "=" }
|
|
|
|
Whitespace { $[\t\n\r]+ }
|
|
|
|
}
|