aboutsummaryrefslogtreecommitdiff
path: root/crowbar_reference_compiler/parser.py
diff options
context:
space:
mode:
Diffstat (limited to 'crowbar_reference_compiler/parser.py')
-rw-r--r--crowbar_reference_compiler/parser.py301
1 files changed, 143 insertions, 158 deletions
diff --git a/crowbar_reference_compiler/parser.py b/crowbar_reference_compiler/parser.py
index 9bb3179..8400480 100644
--- a/crowbar_reference_compiler/parser.py
+++ b/crowbar_reference_compiler/parser.py
@@ -2,169 +2,154 @@ from parsimonious import TokenGrammar, ParseError, IncompleteParseError # type:
grammar = TokenGrammar(
r"""
-HeaderFile = HeaderFileElement+
-HeaderFileElement = IncludeStatement /
- TypeDeclaration /
- FunctionDeclaration
-
-ImplementationFile = ImplementationFileElement+
-ImplementationFileElement = HeaderFileElement /
- FunctionDefinition
-
-IncludeStatement = "include" string_literal ";"
-
-TypeDeclaration = StructDeclaration /
- EnumDeclaration /
- TypedefDeclaration
-StructDeclaration = "struct" identifier "{" VariableDeclaration+ "}" ";"
-EnumDeclaration = "enum" identifier "{" EnumBody "}" ";"
-EnumBody = (identifier ("=" Expression)? "," EnumBody) /
- (identifier ("=" Expression)? ","?)
-TypedefDeclaration = "typedef" identifier "=" Type ";"
-
-FunctionDeclaration = FunctionSignature ";"
-FunctionDefinition = FunctionSignature Block
-FunctionSignature = Type identifier "(" SignatureArguments? ")"
-SignatureArguments = (Type identifier "," SignatureArguments) /
- (Type identifier ","?)
-
-Block = "{" Statement* "}"
+HeaderFile <- IncludeStatement* HeaderFileElement+
+HeaderFileElement <- TypeDefinition / FunctionDeclaration / VariableDefinition / VariableDeclaration
+
+ImplementationFile <- IncludeStatement* ImplementationFileElement+
+ImplementationFileElement <- TypeDefinition / VariableDefinition / FunctionDefinition
+
+IncludeStatement <- 'include' string-literal ';'
+
+TypeDefinition <- StructDefinition / EnumDefinition / UnionDefinition
+StructDefinition <- NormalStructDefinition / OpaqueStructDefinition
+NormalStructDefinition <- 'struct' identifier '{' VariableDeclaration+ '}'
+OpaqueStructDefinition <- 'opaque' 'struct' identifier ';'
+EnumDefinition <- 'enum' identifier '{' EnumMember (',' EnumMember)* ','? '}'
+EnumMember <- identifier ('=' Expression)?
+UnionDefinition <- RobustUnionDefinition / FragileUnionDefinition
+RobustUnionDefinition <- 'union' identifier '{' VariableDeclaration UnionBody '}'
+UnionBody <- 'switch' '(' identifier ')' '{' UnionBodySet+ '}'
+UnionBodySet <- CaseSpecifier+ (VariableDeclaration / ';')
+FragileUnionDefinition <- 'fragile' 'union' identifier '{' VariableDeclaration+ '}'
+
+FunctionDeclaration <- FunctionSignature ';'
+FunctionDefinition <- FunctionSignature Block
+FunctionSignature <- Type identifier '(' SignatureArguments? ')'
+SignatureArguments <- Type identifier (',' Type identifier)* ','?
+
+Block <- '{' Statement* '}'
-Statement = VariableDefinition /
- VariableDeclaration /
- IfStatement /
- SwitchStatement /
- WhileStatement /
- DoWhileStatement /
- ForStatement /
- FlowControlStatement /
- AssignmentStatement /
- ExpressionStatement
-
-VariableDefinition = Type identifier "=" Expression ";"
-VariableDeclaration = Type identifier ";"
-
-IfStatement = ("if" Expression Block "else" Block) /
- ("if" Expression Block)
-
-SwitchStatement = "switch" Expression "{" SwitchCase+ "}"
-SwitchCase = (CaseSpecifier Block) /
- ("default" Block)
-CaseSpecifier = ("case" Expression "," CaseSpecifier) /
- ("case" Expression ","?)
-
-WhileStatement = "while" Expression Block
-DoWhileStatement = "do" Block "while" Expression ";"
-ForStatement = "for" VariableDefinition? ";" Expression ";" AssignmentStatementBody? Block
-
-FlowControlStatement = ("continue" ";") /
- ("break" ";") /
- ("return" Expression? ";")
-
-AssignmentStatement = AssignmentStatementBody ";"
-AssignmentStatementBody = (AssignmentTargetExpression "=" Expression) /
- (AssignmentTargetExpression "+=" Expression) /
- (AssignmentTargetExpression "-=" Expression) /
- (AssignmentTargetExpression "*=" Expression) /
- (AssignmentTargetExpression "/=" Expression) /
- (AssignmentTargetExpression "%=" Expression) /
- (AssignmentTargetExpression "&=" Expression) /
- (AssignmentTargetExpression "^=" Expression) /
- (AssignmentTargetExpression "|=" Expression) /
- (AssignmentTargetExpression "++") /
- (AssignmentTargetExpression "--")
-
-ExpressionStatement = Expression ";"
-
-Type = ("const" BasicType) /
- (BasicType "*") /
- (BasicType "[" Expression "]") /
- (BasicType "function" "(" (BasicType ",")* ")") /
- BasicType
-BasicType = "void" /
- IntegerType /
- ("signed" IntegerType) /
- ("unsigned" IntegerType) /
- "float" /
- "double" /
- "bool" /
- ("struct" identifier) /
- ("enum" identifier) /
- ("typedef" identifier) /
- ("(" Type ")")
-IntegerType = "char" /
- "short" /
- "int" /
- "long"
-
-AssignmentTargetExpression = identifier ATEElementSuffix*
-ATEElementSuffix = ("[" Expression "]") /
- ("." identifier) /
- ("->" identifier)
-
-AtomicExpression = identifier /
- constant /
- string_literal /
- ("(" Expression ")")
-
-ObjectExpression = (AtomicExpression ObjectSuffix*) /
- ArrayLiteralExpression /
- StructLiteralExpression
-ObjectSuffix = ("[" Expression "]") /
- ("(" CommasExpressionList? ")") /
- ("." identifier) /
- ("->" identifier)
-CommasExpressionList = (Expression "," CommasExpressionList) /
- (Expression ","?)
-ArrayLiteralExpression = "{" CommasExpressionList "}"
-StructLiteralExpression = "{" StructLiteralBody "}"
-StructLiteralBody = (StructLiteralElement "," StructLiteralBody?) /
- (StructLiteralElement ","?)
-StructLiteralElement = "." identifier "=" Expression
-
-FactorExpression = ("(" Type ")" FactorExpression) /
- ("&" FactorExpression) /
- ("*" FactorExpression) /
- ("+" FactorExpression) /
- ("-" FactorExpression) /
- ("~" FactorExpression) /
- ("!" FactorExpression) /
- ("sizeof" FactorExpression) /
- ("sizeof" Type) /
- ObjectExpression
-
-TermExpression = FactorExpression TermSuffix*
-TermSuffix = ("*" FactorExpression) /
- ("/" FactorExpression) /
- ("%" FactorExpression)
-
-ArithmeticExpression = TermExpression ArithmeticSuffix*
-ArithmeticSuffix = ("+" TermExpression) /
- ("-" TermExpression)
-
-BitwiseOpExpression = (ArithmeticExpression "<<" ArithmeticExpression) /
- (ArithmeticExpression ">>" ArithmeticExpression) /
- (ArithmeticExpression "^" ArithmeticExpression) /
- (ArithmeticExpression ("&" ArithmeticExpression)+) /
- (ArithmeticExpression ("|" ArithmeticExpression)+) /
- ArithmeticExpression
-
-ComparisonExpression = (BitwiseOpExpression "==" BitwiseOpExpression) /
- (BitwiseOpExpression "!=" BitwiseOpExpression) /
- (BitwiseOpExpression "<=" BitwiseOpExpression) /
- (BitwiseOpExpression ">=" BitwiseOpExpression) /
- (BitwiseOpExpression "<" BitwiseOpExpression) /
- (BitwiseOpExpression ">" BitwiseOpExpression) /
- BitwiseOpExpression
-
-Expression = (ComparisonExpression ("&&" ComparisonExpression)+) /
- (ComparisonExpression ("||" ComparisonExpression)+) /
- ComparisonExpression
+Statement <- VariableDefinition / StructureStatement / FlowControlStatement / AssignmentStatement / FragileStatement / ExpressionStatement / EmptyStatement
+EmptyStatement <- ';'
+FragileStatement <- 'fragile' Statement
+ExpressionStatement <- Expression ';'
+
+VariableDeclaration <- Type identifier ';'
+VariableDefinition <- Type identifier '=' Expression ';'
+
+StructureStatement <- IfStatement / SwitchStatement / WhileStatement / DoWhileStatement / ForStatement
+IfStatement <- 'if' '(' Expression ')' Block ('else' Block)?
+SwitchStatement <- 'switch' '(' Expression ')' '{' (CaseSpecifier / Statement)+ '}'
+CaseSpecifier <- ('case' Expression ':') / ('default' ':')
+WhileStatement <- 'while' '(' Expression ')' Block
+DoWhileStatement <- 'do' Block 'while' '(' Expression ')' ';'
+ForStatement <- 'for' '(' ForInit? ';' Expression ';' ForUpdate? ')' Block
+ForInit <- ForInitializer (',' ForInitializer)* ','?
+ForInitializer <- Type identifier '=' Expression
+ForUpdate <- AssignmentBody (',' AssignmentBody)* ','?
+
+FlowControlStatement <- ContinueStatement / BreakStatement / ReturnStatement
+ContinueStatement <- 'continue' ';'
+BreakStatement <- 'break' ';'
+ReturnStatement <- 'return' Expression? ';'
+
+AssignmentStatement <- AssignmentBody ';'
+AssignmentBody <- DirectAssignmentBody / UpdateAssignmentBody / CrementAssignmentBody
+DirectAssignmentBody <- Expression '=' Expression
+UpdateAssignmentBody <- Expression ('+=' / '-=' / '*=' / '/=' / '%=' / '&=' / '^=' / '|=') Expression
+CrementAssignmentBody <- Expression ('++' / '--')
+
+Type <- ConstType / PointerType / ArrayType / FunctionType / BasicType
+ConstType <- 'const' BasicType
+PointerType <- BasicType '*'
+ArrayType <- BasicType '[' Expression ']'
+FunctionType <- BasicType 'function' '(' FunctionTypeArgs? ')'
+FunctionTypeArgs <- BasicType (',' BasicType)* ','?
+BasicType <- 'void' / 'bool' / 'float32' / 'float64' /
+ 'int8' / 'int16' / 'int32' / 'int64' / 'intaddr' / 'intmax' / 'intsize' /
+ 'uint8' / 'uint16' / 'uint32' / 'uint64' / 'uintaddr' / 'uintmax' / 'uintsize' /
+ ('struct' identifier) / ('enum' identifier) / ('union' identifier) / ('(' Type ')')
+
+
+AtomicExpression <- identifier / constant / 'true' / 'false' / string-literal / ('(' Expression ')')
+
+ObjectExpression <- (AtomicExpression ObjectSuffix*) / ArrayLiteral / StructLiteral
+ObjectSuffix <- ArrayIndexSuffix / FunctionCallSuffix / StructElementSuffix / StructPointerElementSuffix
+
+ArrayIndexSuffix <- '[' Expression ']'
+
+FunctionCallSuffix <- '(' CommasExpressionList? ')'
+CommasExpressionList <- Expression (',' Expression)* ','?
+
+StructElementSuffix <- '.' identifier
+
+StructPointerElementSuffix <- '->' identifier
+
+ArrayLiteral <- '{' CommasExpressionList '}'
+
+StructLiteral <- '{' StructLiteralElement (',' StructLiteralElement)* ','? '}'
+StructLiteralElement <- '.' identifier '=' Expression
+
+FactorExpression <- CastExpression / AddressOfExpression / DerefExpression / PositiveExpression / NegativeExpression / BitwiseNotExpression / LogicalNotExpression / SizeofExpression / ObjectExpression
+
+CastExpression <- '(' Type ')' ObjectExpression
+
+AddressOfExpression <- '&' ObjectExpression
+
+DerefExpression <- '*' ObjectExpression
+
+PositiveExpression <- '+' ObjectExpression
+
+NegativeExpression <- '-' ObjectExpression
+
+BitwiseNotExpression <- '~' ObjectExpression
+
+LogicalNotExpression <- '!' ObjectExpression
+
+SizeofExpression <- ('sizeof' ObjectExpression) / ('sizeof' Type)
+
+TermExpression <- FactorExpression TermSuffix?
+TermSuffix <- ('*' FactorExpression)+ / ('/' FactorExpression)+ / ('%' FactorExpression)+
+
+ArithmeticExpression <- TermExpression ArithmeticSuffix?
+ArithmeticSuffix <- ('+' TermExpression)+ / ('-' TermExpression)+
+
+BitwiseOpExpression <- ShiftExpression / XorExpression / BitwiseAndExpression / BitwiseOrExpression / ArithmeticExpression
+
+ShiftExpression <- (ArithmeticExpression '<<' ArithmeticExpression) / (ArithmeticExpression '>>' ArithmeticExpression)
+
+XorExpression <- ArithmeticExpression '^' ArithmeticExpression
+
+BitwiseAndExpression <- ArithmeticExpression ('&' ArithmeticExpression)+
+
+BitwiseOrExpression <- ArithmeticExpression ('|' ArithmeticExpression)+
+
+ComparisonExpression <- EqualExpression / NotEqualExpression / LessEqExpression / GreaterEqExpression / LessThanExpression / GreaterThanExpression / BitwiseOpExpression
+
+EqualExpression <- BitwiseOpExpression '==' BitwiseOpExpression
+
+NotEqualExpression <- BitwiseOpExpression '!=' BitwiseOpExpression
+
+LessEqExpression <- BitwiseOpExpression '<=' BitwiseOpExpression
+
+GreaterEqExpression <- BitwiseOpExpression '>=' BitwiseOpExpression
+
+LessThanExpression <- BitwiseOpExpression '<' BitwiseOpExpression
+
+GreaterThanExpression <- BitwiseOpExpression '>' BitwiseOpExpression
+
+LogicalOpExpression <- LogicalAndExpression / LogicalOrExpression / ComparisonExpression
+
+LogicalAndExpression <- ComparisonExpression ('&&' ComparisonExpression)+
+
+LogicalOrExpression <- ComparisonExpression ('||' ComparisonExpression)+
+
+Expression <- LogicalOpExpression
identifier = "identifier"
constant = "constant"
string_literal = "string_literal"
-""")
+""".replace(' <- ', ' = ').replace('string-literal', 'string_literal'))
class LegibleParseError(ParseError):