Open mingodad opened 2 years ago
Following the flow of the code on ParseTree.cpp I built so far this initial EBNF grammar that can be used on https://www.bottlecaps.de/rr/ui to get a railroad diagram (https://en.wikipedia.org/wiki/Syntax_diagram).
ParseTree.cpp
Copy and paste the EBNF shown bellow on https://www.bottlecaps.de/rr/ui in the TAB Edit Grammar then switch to the TAB View Diagram.
// // EBNF generated by CocoR parser generator to be viewed with https://www.bottlecaps.de/rr/ui // // // productions // NULLC ::= ParseModule ParseModule ::= ( ParseImport )* ( ParseExpression )* EOF ParseImport ::= lex_import lex_string ( lex_point lex_string )* lex_semicolon ParseExpression ::= ParseStatement | ParseAssignment lex_semicolon ParseStatement ::= ParseClassDefinition | ParseEnumDefinition | ParseNamespaceDefinition | ParseReturn | ParseYield | ParseBreak | ParseContinue | ParseTypedef | ParseBlock | ParseIfElse | ParseForEach | ParseFor | ParseWhile | ParseDoWhile | ParseSwitch | ParseFunctionDefinition | ParseVariableDefinitions ParseAssignment ::= ParseTernaryExpr ( lex_set | GetModifyAssignType ) ParseAssignment lex_semicolon ParseClassDefinition ::= ( ParseAlign )? lex_class SynIdentifier ( lex_semicolon | lex_less SynIdentifier ( lex_comma SynIdentifier )* lex_greater ( lex_extendable )? ( lex_colon ParseType )? lex_ofigure ( ParseClassElement )* lex_cfigure ) ParseEnumDefinition ::= lex_enum SynIdentifier lex_ofigure EnumElement ( lex_comma EnumElement )* lex_cfigure ParseNamespaceDefinition ::= lex_namespace SynIdentifier ( lex_point SynIdentifier )* lex_ofigure ( ParseExpression )* lex_cfigure ParseReturn ::= lex_return ( ParseAssignment )? lex_semicolon ParseYield ::= lex_yield ( ParseAssignment )? lex_semicolon ParseBreak ::= lex_break ( ParseNumber )? lex_semicolon ParseContinue ::= lex_continue ( ParseNumber )? lex_semicolon ParseTypedef ::= lex_typedef ParseType SynIdentifier lex_semicolon ParseBlock ::= lex_ofigure ( ParseExpression )* lex_cfigure ParseIfElse ::= ( lex_at )? lex_if lex_oparen ( ParseType ParseVariableDefinition | ParseAssignment ) lex_cparen ParseExpression ( lex_semicolon )? ( lex_else ( lex_if ParseIfElse | ParseExpression ) ( lex_semicolon )? )? ParseForEach ::= lex_for lex_oparen ParseForEachIterator ( lex_comma ParseForEachIterator )* lex_cparen ParseExpression ParseFor ::= lex_for ( ParseBlock | ( ParseVariableDefinitions | ParseAssignment ) lex_semicolon ParseAssignment lex_semicolon ( lex_ofigure ParseBlock | ParseAssignment ) lex_cparen ParseExpression ) ParseWhile ::= lex_while lex_oparen ParseAssignment lex_cparen ( ParseExpression | lex_semicolon ) ParseDoWhile ::= lex_do ( lex_ofigure ( ParseExpression )* lex_cfigure | ParseExpression ) lex_while lex_oparen ParseAssignment lex_cparen ParseSwitch ::= lex_switch lex_oparen ParseAssignment lex_cparen lex_ofigure ( lex_case ParseAssignment lex_colon ( ParseExpression )* )* ( lex_default lex_colon ( ParseExpression )* )? lex_cfigure ParseFunctionDefinition ::= ( lex_coroutine )? ParseType ( ParseType ( lex_colon | lex_point ) )? ( lex_operator ( lex_obracket lex_cbracket | lex_oparen lex_cparen | Operators ) SynIdentifier | SynIdentifier ( lex_less lex_at SynIdentifier ( lex_comma lex_at SynIdentifier )* lex_greater )? ) lex_oparen ( ParseFunctionArguments )* lex_cparen lex_ofigure ( ParseExpression )* lex_cfigure ParseVariableDefinitions ::= ( ParseAlign )? ParseType ParseVariableDefinition ( lex_comma ParseVariableDefinition )* lex_semicolon ParseAlign ::= lex_align lex_oparen ParseNumber lex_cparen | lex_noalign ParseType ::= ParseTerminalType ( lex_obracket ParseTernaryExpr lex_cbracket )* | ( lex_ref lex_oparen ParseType ( lex_comma ParseType )* lex_cparen )* ParseClassElement ::= ParseTypedef | ParseClassStaticIf | ParseFunctionDefinition | ParseAccessorDefinition | ParseVariableDefinitions | ParseConstantSet ParseClassStaticIf ::= lex_at lex_if lex_oparen ParseAssignment lex_cparen ( lex_ofigure ( ParseClassElement )* lex_cfigure | ParseClassElement ) ( lex_else ( lex_if ParseClassStaticIf | ParseClassElement ) )? ParseAccessorDefinition ::= ParseType SynIdentifier ( lex_ofigure ParseBlock ( "set" lex_oparen SynIdentifier lex_cparen ParseBlock )? lex_cfigure )? lex_semicolon ParseConstantSet ::= lex_const ParseType SynIdentifier lex_set ParseTernaryExpr ( lex_comma SynIdentifier lex_set ParseTernaryExpr )* lex_semicolon EnumElement ::= SynIdentifier ( lex_set ParseTernaryExpr )? ParseTernaryExpr ::= ParseArithmetic ( lex_questionmark ParseAssignment lex_colon ParseAssignment )* ParseNumber ::= lex_intcon | lex_floatcon ParseVariableDefinition ::= SynIdentifier ( lex_set ParseAssignment )? ParseForEachIterator ::= ParseType SynIdentifier lex_in ParseTernaryExpr Operators ::= lex_add | lex_in | lex_set | lex_xorset | lex_bitnot | lex_lognot ParseFunctionArguments ::= ParseFunctionArgument ( lex_comma ParseFunctionArgument )* ParseFunctionArgument ::= ( "explicit" )? ParseType SynIdentifier ( lex_set ParseTernaryExpr )? ParseShortFunctionDefinition ::= lex_less ParseType ( SynIdentifier )? ( lex_comma ParseType ( SynIdentifier )? )* lex_greater ( lex_ofigure ( ParseExpression )* lex_cfigure | ParseStatement | ParseAssignment ) ParseTerminalType ::= SynIdentifier ( lex_point SynIdentifier )* ( lex_less ParseType ( lex_comma ParseType )* lex_greater )? ( lex_shr )? GetModifyAssignType ::= lex_addset | lex_subset | lex_mulset | lex_divset | lex_powset | lex_modset | lex_shlset | lex_shrset | lex_andset | lex_orset | lex_xorset GetUnaryOpType ::= lex_add | lex_sub | lex_bitnot | lex_lognot ParseArithmetic ::= ParseTerminal ( GetBinaryOpType ParseTerminal )* ParseTerminal ::= lex_true | lex_false | lex_nullptr | lex_bitand ParseComplexTerminal | lex_semiquotedchar | GetUnaryOpType ParseTerminal | lex_dec ParseTerminal | lex_inc ParseTerminal | ParseNumber | ParseNew | ParseSizeof | ParseFunctionDefinition | ParseShortFunctionDefinition | ParseComplexTerminal GetBinaryOpType ::= lex_add | lex_sub | lex_mul | lex_div | lex_mod | lex_pow | lex_less | lex_lequal | lex_shl | lex_greater | lex_gequal | lex_shr | lex_equal | lex_nequal | lex_bitand | lex_bitor | lex_bitxor | lex_logand | lex_logor | lex_logxor | lex_in ParseComplexTerminal ::= lex_mul ParseTerminal | ( lex_oparen ParseAssignment lex_cparen | ParseString | ParseArray | ParseType | SynIdentifier | lex_at Operators ) ParsePostExpressions ParseNew ::= lex_new ( lex_oparen ParseType lex_cparen | ParseType ) ( lex_obracket ParseTernaryExpr lex_cbracket )? ( lex_oparen ParseCallArguments lex_cparen )? ( lex_ofigure ( ParseExpression )* lex_cfigure )? ParseSizeof ::= lex_sizeof lex_oparen ParseAssignment lex_cparen ParseString ::= ( lex_at )? lex_quotedstring ParseArray ::= lex_ofigure ( lex_for ( ParseExpression )* | ParseTernaryExpr ( lex_comma ParseTernaryExpr )* ) lex_cfigure ParsePostExpressions ::= ( ( lex_point SynIdentifier | lex_obracket ParseCallArguments lex_cbracket | lex_oparen ParseCallArguments lex_cparen | lex_with lex_less ParseType ( lex_comma ParseType )* lex_greater lex_oparen ParseCallArguments lex_cparen ) )* ( lex_inc | lex_dec ) ParseCallArguments ::= ParseCallArgument ( lex_comma ParseCallArgument )* ParseCallArgument ::= SynIdentifier ( lex_colon ParseAssignment | ParseAssignment ) lex_quotedstring ::= "??()??" // // tokens // lex_add ::= "+" lex_addset ::= "+=" lex_align ::= "align" lex_andset ::= "&=" lex_at ::= "@" lex_bitand ::= "&" lex_bitnot ::= "~" lex_bitor ::= "|" lex_bitxor ::= "^" lex_break ::= "break" lex_case ::= "case" lex_cbracket ::= "]" lex_cfigure ::= "}" lex_class ::= "class" lex_colon ::= ":" lex_comma ::= "," lex_const ::= "const" lex_continue ::= "continue" lex_coroutine ::= "coroutine" lex_cparen ::= ")" lex_dec ::= "--" lex_default ::= "default" lex_div ::= "/" lex_divset ::= "/=" lex_do ::= "do" lex_else ::= "else" lex_enum ::= "enum" lex_equal ::= "==" lex_extendable ::= "extendable" lex_false ::= "false" lex_for ::= "for" lex_gequal ::= ">=" lex_greater ::= ">" lex_if ::= "if" lex_import ::= "import" lex_inc ::= "++" lex_in ::= "in" lex_lequal ::= "<=" lex_less ::= "<" lex_logand ::= "&&" lex_lognot ::= "!" lex_logor ::= "||" lex_logxor ::= "^^" lex_mod ::= "%" lex_modset ::= "%=" lex_mul ::= "*" lex_mulset ::= "*=" lex_namespace ::= "namespace" lex_nequal ::= "!=" lex_new ::= "new" lex_noalign ::= "noalign" lex_nullptr ::= "nullptr" lex_obracket ::= "[" lex_ofigure ::= "{" lex_oparen ::= "(" lex_operator ::= "operator" lex_orset ::= "|=" lex_point ::= "." lex_pow ::= "**" lex_powset ::= "**=" lex_questionmark ::= "?" lex_ref ::= "ref" lex_return ::= "return" lex_semicolon ::= ";" lex_set ::= "=" lex_sizeof ::= "sizeof" lex_shl ::= "<<" lex_shlset ::= "<<=" lex_shr ::= ">>" lex_shrset ::= ">>=" lex_sub ::= "-" lex_subset ::= "-=" lex_switch ::= "switch" lex_true ::= "true" lex_typedef ::= "typedef" lex_while ::= "while" lex_with ::= "with" lex_xorset ::= "^=" lex_yield ::= "yield"
Following the flow of the code on
ParseTree.cpp
I built so far this initial EBNF grammar that can be used on https://www.bottlecaps.de/rr/ui to get a railroad diagram (https://en.wikipedia.org/wiki/Syntax_diagram).Copy and paste the EBNF shown bellow on https://www.bottlecaps.de/rr/ui in the TAB Edit Grammar then switch to the TAB View Diagram.