WheretIB / nullc

Fast C-like programming language with advanced features
MIT License
163 stars 13 forks source link

Grammar railroad diagram #27

Open mingodad opened 2 years ago

mingodad commented 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).

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"