Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Grammar railroad diagram #57

Open
mingodad opened this issue Feb 9, 2023 · 8 comments
Open

Grammar railroad diagram #57

mingodad opened this issue Feb 9, 2023 · 8 comments

Comments

@mingodad
Copy link

mingodad commented Feb 9, 2023

Would be nice if copper could also generate an EBNF as understood by https://www.bottlecaps.de/rr/ui to generate railroad diagrams (https://en.wikipedia.org/wiki/Syntax_diagram).

I extended bison, byacc, lemon and btyacc to do so and can be seen here https://github.com/mingodad/lalr-parser-test , also CocoR here https://github.com/mingodad/CocoR-Java , unicc here https://github.com/mingodad/unicc , and peg/leg here https://github.com/mingodad/peg .

Would be nice to have it output a consolidated EBNF to have a full global view of the final grammar because indirect usage of copper, silver and ableC uses several pieces to compose the final grammar.

@mingodad
Copy link
Author

Looking through the documentation I can see that almost all pieces are already there, bellow is a manual translation for the https://github.com/melt-umn/copper/blob/develop/doc/manual/CopperUserManual.md#recognizer-without-semantic-actions example:

//^ ::= expr $  [13]
expr ::= expr PLUS expr
expr ::= expr BINARY_MINUS expr 
expr ::= expr TIMES expr
expr ::= expr DIVIDE expr  
expr ::= UNARY_MINUS expr
expr ::= LPAREN expr RPAREN 
expr ::= NUMBER

PLUS           ::= '+'
UNARY_MINUS    ::= '-'
BINARY_MINUS   ::= '-'
TIMES          ::= '*'
DIVIDE         ::= '/'
LPAREN         ::= '('
RPAREN         ::= ')'
NUMBER ::= '0'|([1-9][0-9]*)

@mingodad
Copy link
Author

mingodad commented Feb 10, 2023

And here is the manual fixes applied to the output of silver --copperdump -o ableC.jar -I grammars $@ edu:umn:cs:melt:ableC:compiler that can be viewed at https://www.bottlecaps.de/rr/ui .

Copy and paste the EBNF shown bellow on https://www.bottlecaps.de/rr/ui on the tab Edit Grammar the click on the tab View Diagram to see/download a navigable railroad diagram.

grammar_start_at ::= a_Root
	| notes_for_railroad
notes_for_railroad ::=
	| 'a_ prefix for edu:umn:cs:melt:ableC:concretesyntax:'
	| 'b_ prefix for edu:umn:cs:melt:ableC:concretesyntax:gcc_exts:'
	| 'c_ prefix for edu:umn:cs:melt:ableC:concretesyntax:c11:'
a_AbstractDeclarator_c  ::=  a_Pointer_c   a_DirectAbstractDeclarator_c
a_AbstractDeclarator_c  ::=  a_DirectAbstractDeclarator_c
a_AbstractDeclarator_c  ::=  a_Pointer_c
a_AddMulLeftOp_c  ::=  'AddMulLeft_Never!!!nevernever1234567890'
a_AddMulLeft_c  ::=  a_AddMulRight_c
a_AddMulLeft_c  ::=  a_AddMulLeft_c   a_AddMulLeftOp_c   a_AddMulRight_c
a_AddMulNoneOp_c  ::=  'AddMulNone_Never!!!nevernever1234567890'
a_AddMulNone_c  ::=  a_MultiplicativeExpr_c
a_AddMulNone_c  ::=  a_MultiplicativeExpr_c   a_AddMulNoneOp_c   a_MultiplicativeExpr_c
a_AddMulRightOp_c  ::=  'AddMulRight_Never!!!nevernever1234567890'
a_AddMulRight_c  ::=  a_AddMulNone_c
a_AddMulRight_c  ::=  a_AddMulNone_c   a_AddMulRightOp_c   a_AddMulRight_c
a_AdditiveExpr_c  ::=  a_AddMulLeft_c
a_AdditiveExpr_c  ::=  a_AdditiveExpr_c   a_AdditiveOp_c   a_AddMulLeft_c
a_AdditiveOp_c  ::=  '+'
a_AdditiveOp_c  ::=  '-'
a_AndExpr_c  ::=  a_EqualityExpr_c
a_AndExpr_c  ::=  a_AndExpr_c   a_AndOp_c   a_EqualityExpr_c
a_AndOp_c  ::=  '&'
a_ArgumentExprList_c  ::=  a_AssignExpr_c
a_ArgumentExprList_c  ::=  a_ArgumentExprList_c   ','   a_AssignExpr_c
a_ArrayDesignator_c  ::=  '['   a_ConstantExpr_c   '...'   a_ConstantExpr_c   ']'
a_ArrayDesignator_c  ::=  '['   a_ConstantExpr_c   ']'
a_AssignExpr_c  ::=  a_ConditionalExpr_c
a_AssignExpr_c  ::=  a_UnaryExpr_c   a_AssignOp_c   a_AssignExpr_c
a_AssignOp_c  ::=  '='
a_AssignOp_c  ::=  '*='
a_AssignOp_c  ::=  '/='
a_AssignOp_c  ::=  '%='
a_AssignOp_c  ::=  '+='
a_AssignOp_c  ::=  '-='
a_AssignOp_c  ::=  '<<='
a_AssignOp_c  ::=  '>>='
a_AssignOp_c  ::=  '&='
a_AssignOp_c  ::=  '^='
a_AssignOp_c  ::=  '|='
a_BlockItemList_c  ::=  a_BlockItem_c
a_BlockItemList_c  ::=  a_BlockItemList_c   a_BlockItem_c
a_BlockItem_c  ::=  a_Stmt_c
a_BlockItem_c  ::=  '__extension__'   a_Declaration_c
a_BlockItem_c  ::=  b_NestedFunctionDefinition_c
a_BlockItem_c  ::=  a_Declaration_c
a_CastExpr_c  ::=  a_UnaryExpr_c
a_CastExpr_c  ::=  '('   a_TypeName_c   ')'   a_CastExpr_c
a_CompoundStatement_c  ::=  '{'    b_LabelDeclarations_c   a_BlockItemList_c   '}'
a_CompoundStatement_c  ::=  '{'    a_BlockItemList_c   '}'
a_CompoundStatement_c  ::=  '{'    '}'
a_ConditionalExpr_c  ::=  a_LogicalOrExpr_c   '?'   ':'   a_ConditionalExpr_c
a_ConditionalExpr_c  ::=  a_LogicalOrExpr_c   '?'   a_Expr_c   ':'   a_ConditionalExpr_c
a_ConditionalExpr_c  ::=  a_LogicalOrExpr_c
a_ConstantExpr_c  ::=  a_ConditionalExpr_c
a_Constant_c  ::=  b_IDecConstant_t
a_Constant_c  ::=  b_IDecConstantU_t
a_Constant_c  ::=  b_IDecConstantL_t
a_Constant_c  ::=  b_IDecConstantUL_t
a_Constant_c  ::=  b_IDecConstantLL_t
a_Constant_c  ::=  b_IDecConstantULL_t
a_Constant_c  ::=  b_IFloatConstant_t
a_Constant_c  ::=  b_IFloatConstantFloat_t
a_Constant_c  ::=  b_IFloatConstantLongDouble_t
a_Constant_c  ::=  b_IHexFloatConstant_t
a_Constant_c  ::=  b_IHexFloatConstantFloat_t
a_Constant_c  ::=  b_IHexFloatConstantLongDouble_t
a_Constant_c  ::=  a_DecConstant_t
a_Constant_c  ::=  a_DecConstantU_t
a_Constant_c  ::=  a_DecConstantL_t
a_Constant_c  ::=  a_DecConstantUL_t
a_Constant_c  ::=  a_DecConstantLL_t
a_Constant_c  ::=  a_DecConstantULL_t
a_Constant_c  ::=  a_OctConstant_t
a_Constant_c  ::=  a_OctConstantU_t
a_Constant_c  ::=  a_OctConstantL_t
a_Constant_c  ::=  a_OctConstantUL_t
a_Constant_c  ::=  a_OctConstantLL_t
a_Constant_c  ::=  a_OctConstantULL_t
a_Constant_c  ::=  a_OctConstantError_t
a_Constant_c  ::=  a_HexConstant_t
a_Constant_c  ::=  a_HexConstantU_t
a_Constant_c  ::=  a_HexConstantL_t
a_Constant_c  ::=  a_HexConstantUL_t
a_Constant_c  ::=  a_HexConstantLL_t
a_Constant_c  ::=  a_HexConstantULL_t
a_Constant_c  ::=  a_FloatConstant_t
a_Constant_c  ::=  a_FloatConstantFloat_t
a_Constant_c  ::=  a_FloatConstantLongDouble_t
a_Constant_c  ::=  a_HexFloatConstant_t
a_Constant_c  ::=  a_HexFloatConstantFloat_t
a_Constant_c  ::=  a_HexFloatConstantLongDouble_t
a_Constant_c  ::=  a_CharConstant_t
a_Constant_c  ::=  a_CharConstantL_t
a_Constant_c  ::=  a_CharConstantU_t
a_Constant_c  ::=  a_CharConstantUBig_t
a_DeclarationList_c  ::=
a_DeclarationList_c  ::=  a_Declaration_c   a_DeclarationList_c
a_DeclarationSpecifiers_c  ::=  c_AlignmentSpecifier_c   a_DeclarationSpecifiers_c
a_DeclarationSpecifiers_c  ::=  c_AlignmentSpecifier_c
a_DeclarationSpecifiers_c  ::=  b_Attributes_c   a_DeclarationSpecifiers_c
a_DeclarationSpecifiers_c  ::=  b_Attributes_c
a_DeclarationSpecifiers_c  ::=  a_TypeSpecifierItem_c
a_DeclarationSpecifiers_c  ::=  a_TypeQualifier_c   a_DeclarationSpecifiers_c
a_DeclarationSpecifiers_c  ::=  a_TypeQualifier_c
a_DeclarationSpecifiers_c  ::=  a_FunctionSpecifier_c   a_DeclarationSpecifiers_c
a_DeclarationSpecifiers_c  ::=  a_FunctionSpecifier_c
a_DeclarationSpecifiers_c  ::=  a_StorageClassSpecifier_c   a_DeclarationSpecifiers_c
a_DeclarationSpecifiers_c  ::=  a_StorageClassSpecifier_c
a_DeclarationSpecifiers_c  ::=  a_TypeSpecifierItem_c   a_DeclarationSpecifiers_c
a_Declaration_c  ::=  c_StaticAssertDeclaration_c
a_Declaration_c  ::=  a_DeclarationSpecifiers_c   a_InitDeclaratorList_c   ';'
a_Declaration_c  ::=  a_DeclarationSpecifiers_c   ';'
a_Declarator_c  ::=  a_Pointer_c   a_DirectDeclarator_c
a_Declarator_c  ::=  a_DirectDeclarator_c
a_Designation_c  ::=  a_ArrayDesignator_c
a_Designation_c  ::=  a_Identifier_c   ':'
a_Designation_c  ::=  a_DesignatorList_c   '='
a_DesignatorList_c  ::=  a_DesignatorList_c   a_Designator_c
a_DesignatorList_c  ::=  a_Designator_c
a_Designator_c  ::=  a_ArrayDesignator_c
a_Designator_c  ::=  '.'   a_Identifier_c
a_DirectAbstractDeclarator_c  ::=  '('   a_AbstractDeclarator_c   ')'
a_DirectAbstractDeclarator_c  ::=  a_PostfixModifier_c
a_DirectAbstractDeclarator_c  ::=  a_DirectAbstractDeclarator_c   a_PostfixModifier_c
a_DirectDeclarator_c  ::=  '('   a_Declarator_c   ')'
a_DirectDeclarator_c  ::=  a_DirectDeclarator_c   '('   a_IdentifierList_c   ')'   a_OptTypeQualifierList_c
a_DirectDeclarator_c  ::=  a_Identifier_c
a_DirectDeclarator_c  ::=  a_DirectDeclarator_c   a_PostfixModifier_c
a_EnumSpecifier_c  ::=  'enum'   '{'    a_EnumeratorList_c   '}'
a_EnumSpecifier_c  ::=  'enum'   a_Identifier_c   '{'    a_EnumeratorList_c   '}'
a_EnumSpecifier_c  ::=  'enum'   '{'    a_EnumeratorList_c   ','   '}'
a_EnumSpecifier_c  ::=  'enum'   a_Identifier_c   '{'    a_EnumeratorList_c   ','   '}'
a_EnumSpecifier_c  ::=  'enum'   a_Identifier_c
a_EnumeratorList_c  ::=  a_Enumerator_c
a_EnumeratorList_c  ::=  a_EnumeratorList_c   ','   a_Enumerator_c
a_Enumerator_c  ::=  a_Identifier_c
a_Enumerator_c  ::=  a_Identifier_c   '='   a_ConstantExpr_c
a_EqualityExpr_c  ::=  a_RelationalExpr_c
a_EqualityExpr_c  ::=  a_EqualityExpr_c   a_EqualityOp_c   a_RelationalExpr_c
a_EqualityOp_c  ::=  '=='
a_EqualityOp_c  ::=  '!='
a_ExclusiveOrExpr_c  ::=  a_AndExpr_c
a_ExclusiveOrExpr_c  ::=  a_ExclusiveOrExpr_c   a_ExclusiveOrOp_c   a_AndExpr_c
a_ExclusiveOrOp_c  ::=  '^'
a_ExprStmt_c  ::=  ';'
a_ExprStmt_c  ::=  a_Expr_c   ';'
a_Expr_c  ::=  'TypeNames_NEVER_t!!!nevernever1234567890'   a_TypeNames_c   ')'
a_Expr_c  ::=  'TypeNames_NEVER_t!!!nevernever1234567890'   a_TypeNames_c   '{'
a_Expr_c  ::=  'TypeNames_NEVER_t!!!nevernever1234567890'   a_TypeNames_c   '}'
a_Expr_c  ::=  'TypeNames_NEVER_t!!!nevernever1234567890'   a_TypeNames_c   '>'
a_Expr_c  ::=  'TypeNames_NEVER_t!!!nevernever1234567890'   a_TypeNames_c   ';'
a_Expr_c  ::=  'TypeNames_NEVER_t!!!nevernever1234567890'   a_TypeNames_c   a_AllowSEUDecl_t
a_Expr_c  ::=  'Names_NEVER_t!!!nevernever1234567890'   a_Names_c   ')'
a_Expr_c  ::=  'Names_NEVER_t!!!nevernever1234567890'   a_Names_c   '}'
a_Expr_c  ::=  'Names_NEVER_t!!!nevernever1234567890'   a_Names_c   '>'
a_Expr_c  ::=  'Names_NEVER_t!!!nevernever1234567890'   a_Names_c   ';'
a_Expr_c  ::=  'Declarator_NEVER_t!!!nevernever1234567890'   a_Declarator_c   '>'
a_Expr_c  ::=  'DirectDeclarator_NEVER_t!!!nevernever1234567890'   a_DirectDeclarator_c   '>'
a_Expr_c  ::=  a_AssignExpr_c   ','   a_Expr_c
a_Expr_c  ::=  'Expr_NEVER_t!!!nevernever1234567890'   a_Expr_c   a_AllowSEUDecl_t
a_Expr_c  ::=  a_AssignExpr_c
a_Expr_c  ::=  'TypeIdName_Never!!!nevernever1234567890'   a_TypeIdName_c   '<'
a_ExternalDeclaration_c  ::=  '__extension__'   a_ExternalDeclaration_c
a_ExternalDeclaration_c  ::=  b_SimpleAsmStatement_c
a_ExternalDeclaration_c  ::=  '#'   'pragma'   b_Pack_t
a_ExternalDeclaration_c  ::=  '#'   'pragma'   'redefine_extname'   a_Identifier_c   a_Identifier_c
a_ExternalDeclaration_c  ::=  '#'   'pragma'   b_GCC_t
a_ExternalDeclaration_c  ::=  a_Declaration_c
a_ExternalDeclaration_c  ::=  a_FunctionDefinition_c
a_FunctionDefinition_c  ::=  a_InitialFunctionDefinition_c   a_CompoundStatement_c
a_FunctionSpecifier_c  ::=  '_Noreturn'
a_FunctionSpecifier_c  ::=  '__inline__'
a_FunctionSpecifier_c  ::=  '__inline'
a_FunctionSpecifier_c  ::=  'inline'
a_IdentifierList_c  ::=  a_Identifier_c
a_IdentifierList_c  ::=  a_IdentifierList_c   ','   a_Identifier_c
a_Identifier_c  ::=  a_Identifier_t
a_InclusiveOrExpr_c  ::=  a_ExclusiveOrExpr_c
a_InclusiveOrExpr_c  ::=  a_InclusiveOrExpr_c   a_InclusiveOrOp_c   a_ExclusiveOrExpr_c
a_InclusiveOrOp_c  ::=  '|'
a_InitDeclaratorList_c  ::=  a_InitDeclarator_c
a_InitDeclaratorList_c  ::=  a_InitDeclaratorList_c   ','   a_InitDeclarator_c
a_InitDeclarator_c  ::=  a_Declarator_c   b_Attributes_c
a_InitDeclarator_c  ::=  a_Declarator_c   b_Attributes_c   '='   a_Initializer_c
a_InitDeclarator_c  ::=  a_Declarator_c   b_SimpleAsmStatement_c
a_InitDeclarator_c  ::=  a_Declarator_c   b_SimpleAsmStatement_c   b_Attributes_c
a_InitDeclarator_c  ::=  a_Declarator_c
a_InitDeclarator_c  ::=  a_Declarator_c   '='   a_Initializer_c
a_InitialFunctionDefinition_c  ::=  a_DeclarationSpecifiers_c   a_Declarator_c   a_InitiallyUnqualifiedDeclarationList_c
a_InitialFunctionDefinition_c  ::=  a_Declarator_c   a_InitiallyUnqualifiedDeclarationList_c
a_InitializerList_c  ::=  a_Initializer_c
a_InitializerList_c  ::=  a_Designation_c   a_Initializer_c
a_InitializerList_c  ::=  a_InitializerList_c   ','   a_Initializer_c
a_InitializerList_c  ::=  a_InitializerList_c   ','   a_Designation_c   a_Initializer_c
a_Initializer_c  ::=  '{'    '}'
a_Initializer_c  ::=  a_AssignExpr_c
a_Initializer_c  ::=  '{'    a_InitializerList_c   '}'
a_Initializer_c  ::=  '{'    a_InitializerList_c   ','   '}'
a_InitiallyUnqualifiedDeclarationList_c  ::=
a_InitiallyUnqualifiedDeclarationList_c  ::=  a_InitiallyUnqualifiedDeclaration_c   a_DeclarationList_c
a_InitiallyUnqualifiedDeclarationSpecifiers_c  ::=  a_StorageClassSpecifier_c   a_DeclarationSpecifiers_c
a_InitiallyUnqualifiedDeclarationSpecifiers_c  ::=  a_StorageClassSpecifier_c
a_InitiallyUnqualifiedDeclarationSpecifiers_c  ::=  a_TypeSpecifierItem_c   a_DeclarationSpecifiers_c
a_InitiallyUnqualifiedDeclarationSpecifiers_c  ::=  a_TypeSpecifierItem_c
a_InitiallyUnqualifiedDeclarationSpecifiers_c  ::=  a_FunctionSpecifier_c   a_DeclarationSpecifiers_c
a_InitiallyUnqualifiedDeclarationSpecifiers_c  ::=  a_FunctionSpecifier_c
a_InitiallyUnqualifiedDeclaration_c  ::=  a_InitiallyUnqualifiedDeclarationSpecifiers_c   a_InitDeclaratorList_c   ';'
a_InitiallyUnqualifiedDeclaration_c  ::=  a_InitiallyUnqualifiedDeclarationSpecifiers_c   ';'
a_IterationStmt_c  ::=  'for'   '('   a_ExprStmt_c   a_ExprStmt_c   ')'   a_Stmt_c
a_IterationStmt_c  ::=  'for'   '('   a_Declaration_c   a_ExprStmt_c   a_Expr_c   ')'   a_Stmt_c
a_IterationStmt_c  ::=  'for'   '('   a_Declaration_c   a_ExprStmt_c   ')'   a_Stmt_c
a_IterationStmt_c  ::=  'while'   '('   a_Expr_c   ')'   a_Stmt_c
a_IterationStmt_c  ::=  'do'   a_Stmt_c   'while'   '('   a_Expr_c   ')'   ';'
a_IterationStmt_c  ::=  'for'   '('   a_ExprStmt_c   a_ExprStmt_c   a_Expr_c   ')'   a_Stmt_c
a_JumpStmt_c  ::=  'goto'   '*'   a_Expr_c   ';'
a_JumpStmt_c  ::=  b_Asm_Starter_c   'goto'   '('   a_StringConstant_c   ':'   ':'   ':'   ':'   a_IdentifierList_c   ')'
a_JumpStmt_c  ::=  'goto'   a_Identifier_c   ';'
a_JumpStmt_c  ::=  'continue'   ';'
a_JumpStmt_c  ::=  'break'   ';'
a_JumpStmt_c  ::=  'return'   ';'
a_JumpStmt_c  ::=  'return'   a_Expr_c   ';'
a_LabeledStmt_c  ::=  a_Identifier_c   ':'   b_Attributes_c   a_Stmt_c
a_LabeledStmt_c  ::=  'case'   a_ConstantExpr_c   '...'   a_ConstantExpr_c   ':'   a_Stmt_c
a_LabeledStmt_c  ::=  a_Identifier_c   ':'   a_Stmt_c
a_LabeledStmt_c  ::=  'case'   a_ConstantExpr_c   ':'   a_Stmt_c
a_LabeledStmt_c  ::=  'default'   ':'   a_Stmt_c
a_LogicalAndExpr_c  ::=  a_InclusiveOrExpr_c
a_LogicalAndExpr_c  ::=  a_LogicalAndExpr_c   a_LogicalAndOp_c   a_InclusiveOrExpr_c
a_LogicalAndOp_c  ::=  '&&'
a_LogicalOrExpr_c  ::=  a_LogicalAndExpr_c
a_LogicalOrExpr_c  ::=  a_LogicalOrExpr_c   a_LogicalOrOp_c   a_LogicalAndExpr_c
a_LogicalOrOp_c  ::=  '||'
a_MultiplicativeExpr_c  ::=  a_CastExpr_c
a_MultiplicativeExpr_c  ::=  a_MultiplicativeExpr_c   a_MultiplicativeOp_c   a_CastExpr_c
a_MultiplicativeOp_c  ::=  '*'
a_MultiplicativeOp_c  ::=  '/'
a_MultiplicativeOp_c  ::=  '%'
a_Names_c  ::=  a_Identifier_c   ','   a_Names_c
a_Names_c  ::=  a_Identifier_c
a_Names_c  ::=
a_OptTypeQualifierList_c  ::=
a_OptTypeQualifierList_c  ::=  a_TypeQualifierList_c
a_ParameterDeclaration_c  ::=  a_DeclarationSpecifiers_c   a_Declarator_c   b_Attributes_c
a_ParameterDeclaration_c  ::=  a_DeclarationSpecifiers_c   a_AbstractDeclarator_c   b_Attributes_c
a_ParameterDeclaration_c  ::=  a_DeclarationSpecifiers_c   a_Declarator_c
a_ParameterDeclaration_c  ::=  a_DeclarationSpecifiers_c   a_AbstractDeclarator_c
a_ParameterDeclaration_c  ::=  a_DeclarationSpecifiers_c
a_ParameterList_c  ::=  a_ParameterDeclaration_c
a_ParameterList_c  ::=  a_ParameterList_c   ','   a_ParameterDeclaration_c
a_ParameterTypeList_c  ::=  a_ParameterList_c
a_ParameterTypeList_c  ::=  a_ParameterList_c   ','   '...'
a_Pointer_c  ::=  '*'
a_Pointer_c  ::=  '*'   a_TypeQualifierList_c
a_Pointer_c  ::=  '*'   a_Pointer_c
a_Pointer_c  ::=  '*'   a_TypeQualifierList_c   a_Pointer_c
a_PostfixExpr_c  ::=  '('   a_TypeName_c   ')'   '{'    '}'
a_PostfixExpr_c  ::=  a_PrimaryExpr_c
a_PostfixExpr_c  ::=  a_PostfixExpr_c   '['   a_Expr_c   ']'
a_PostfixExpr_c  ::=  a_PostfixExpr_c   '('   a_ArgumentExprList_c   ')'
a_PostfixExpr_c  ::=  a_PostfixExpr_c   '('   a_ArgumentExprList_c   ','   ')'
a_PostfixExpr_c  ::=  a_PostfixExpr_c   '('   ')'
a_PostfixExpr_c  ::=  a_PostfixExpr_c   a_PostfixOp_c
a_PostfixExpr_c  ::=  '('   a_TypeName_c   ')'   '{'    a_InitializerList_c   '}'
a_PostfixExpr_c  ::=  '('   a_TypeName_c   ')'   '{'    a_InitializerList_c   ','   '}'
a_PostfixModifier_c  ::=  '['   ']'
a_PostfixModifier_c  ::=  '['   a_TypeQualifierList_c   a_AssignExpr_c   ']'
a_PostfixModifier_c  ::=  '['   a_AssignExpr_c   ']'
a_PostfixModifier_c  ::=  '['   a_TypeQualifierList_c   ']'
a_PostfixModifier_c  ::=  '['   'static'   a_TypeQualifierList_c   a_AssignExpr_c   ']'
a_PostfixModifier_c  ::=  '['   'static'   a_AssignExpr_c   ']'
a_PostfixModifier_c  ::=  '['   a_TypeQualifierList_c   'static'   a_AssignExpr_c   ']'
a_PostfixModifier_c  ::=  '['   a_TypeQualifierList_c   '*'   ']'
a_PostfixModifier_c  ::=  '['   '*'   ']'
a_PostfixModifier_c  ::=  '('   a_ParameterTypeList_c   ')'   a_OptTypeQualifierList_c
a_PostfixModifier_c  ::=  '('   ')'   a_OptTypeQualifierList_c
a_PostfixOp_c  ::=  '.'   a_Identifier_c
a_PostfixOp_c  ::=  '->'   a_Identifier_c
a_PostfixOp_c  ::=  '++'
a_PostfixOp_c  ::=  '--'
a_PrimaryExpr_c  ::=  c_GenericSelection_c
a_PrimaryExpr_c  ::=  '('   '{'    a_BlockItemList_c   '}'   ')'
a_PrimaryExpr_c  ::=  '__builtin_va_arg'   '('   a_AssignExpr_c   ','   a_TypeName_c   ')'
a_PrimaryExpr_c  ::=  '__builtin_offsetof'   '('   a_TypeName_c   ','   b_MemberDesignator_c   ')'
a_PrimaryExpr_c  ::=  '__builtin_types_compatible_p'   '('   a_TypeName_c   ','   a_TypeName_c   ')'
a_PrimaryExpr_c  ::=  '__builtin_constant_p'   '('   a_AssignExpr_c   ')'
a_PrimaryExpr_c  ::=  '__builtin_va_arg_pack'   '('   ')'
a_PrimaryExpr_c  ::=  '__builtin_expect'   '('   a_AssignExpr_c   ','   a_ConstantExpr_c   ')'
a_PrimaryExpr_c  ::=  '__builtin_va_start'   '('   a_Identifier_c   ','   a_Identifier_c   ')'
a_PrimaryExpr_c  ::=  '__builtin_va_end'   '('   a_Identifier_c   ')'
a_PrimaryExpr_c  ::=  a_Identifier_c
a_PrimaryExpr_c  ::=  a_Constant_c
a_PrimaryExpr_c  ::=  a_StringConstant_c
a_PrimaryExpr_c  ::=  '('   a_Expr_c   ')'
a_RelationalExpr_c  ::=  a_ShiftExpr_c
a_RelationalExpr_c  ::=  a_RelationalExpr_c   a_RelationalOp_c   a_ShiftExpr_c
a_RelationalOp_c  ::=  '<'
a_RelationalOp_c  ::=  '>'
a_RelationalOp_c  ::=  '<='
a_RelationalOp_c  ::=  '>='
a_Root  ::=  a_TranslationUnit_c
a_Root  ::=
a_SelectionStmt_c  ::=  'if'   '('   a_Expr_c   ')'   a_Stmt_c
a_SelectionStmt_c  ::=  'if'   '('   a_Expr_c   ')'   a_Stmt_c   'else'   a_Stmt_c
a_SelectionStmt_c  ::=  'switch'   '('   a_Expr_c   ')'   a_Stmt_c
a_ShiftExpr_c  ::=  a_AdditiveExpr_c
a_ShiftExpr_c  ::=  a_ShiftExpr_c   a_ShiftOp_c   a_AdditiveExpr_c
a_ShiftOp_c  ::=  '<<'
a_ShiftOp_c  ::=  '>>'
a_SpecifierQualifierList_c  ::=  b_Attributes_c   a_SpecifierQualifierList_c
a_SpecifierQualifierList_c  ::=  b_Attributes_c
a_SpecifierQualifierList_c  ::=  a_TypeSpecifierItem_c   a_SpecifierQualifierList_c
a_SpecifierQualifierList_c  ::=  a_TypeSpecifierItem_c
a_SpecifierQualifierList_c  ::=  a_TypeQualifier_c   a_SpecifierQualifierList_c
a_SpecifierQualifierList_c  ::=  a_TypeQualifier_c
a_Stmt_c  ::=  a_ExprStmt_c
a_Stmt_c  ::=  '#'   'pragma'   b_OMP_t
a_Stmt_c  ::=  '#'   'pragma'   b_OMPFor_t
a_Stmt_c  ::=  b_Asm_Statement_c
a_Stmt_c  ::=  a_LabeledStmt_c
a_Stmt_c  ::=  a_CompoundStatement_c
a_Stmt_c  ::=  a_SelectionStmt_c
a_Stmt_c  ::=  a_IterationStmt_c
a_Stmt_c  ::=  a_JumpStmt_c
a_StorageClassSpecifier_c  ::=  '_Thread_local'
a_StorageClassSpecifier_c  ::=  '__thread'
a_StorageClassSpecifier_c  ::=  'typedef'
a_StorageClassSpecifier_c  ::=  'extern'
a_StorageClassSpecifier_c  ::=  'static'
a_StorageClassSpecifier_c  ::=  'auto'
a_StorageClassSpecifier_c  ::=  'register'
a_StringConstant_c  ::=  a_StringLiteral_c
a_StringConstant_c  ::=  a_StringLiteral_c   a_StringConstant_c
a_StringLiteral_c  ::=  a_StringConstant_t
a_StringLiteral_c  ::=  a_StringConstantU8_t
a_StringLiteral_c  ::=  a_StringConstantL_t
a_StringLiteral_c  ::=  a_StringConstantU_t
a_StringLiteral_c  ::=  a_StringConstantUBig_t
a_StructDeclarationList_c  ::=  a_StructDeclaration_c
a_StructDeclarationList_c  ::=  a_StructDeclarationList_c   a_StructDeclaration_c
a_StructDeclaration_c  ::=  a_StructOrUnion_c   a_Identifier_c   '{'    a_StructDeclarationList_c   '}'   ';'
a_StructDeclaration_c  ::=  a_StructOrUnion_c   '{'    a_StructDeclarationList_c   '}'   ';'
a_StructDeclaration_c  ::=  a_StructOrUnion_c   b_Attributes_c   a_Identifier_c   '{'    a_StructDeclarationList_c   '}'   ';'
a_StructDeclaration_c  ::=  a_StructOrUnion_c   b_Attributes_c   '{'    a_StructDeclarationList_c   '}'   ';'
a_StructDeclaration_c  ::=  a_StructOrUnion_c   a_Identifier_c   '{'    a_StructDeclarationList_c   '}'   b_Attributes_c   ';'
a_StructDeclaration_c  ::=  a_StructOrUnion_c   '{'    a_StructDeclarationList_c   '}'   b_Attributes_c   ';'
a_StructDeclaration_c  ::=  '__extension__'   a_StructDeclaration_c
a_StructDeclaration_c  ::=  a_SpecifierQualifierList_c   a_StructDeclaratorList_c   ';'
a_StructDeclaratorList_c  ::=  a_StructDeclarator_c
a_StructDeclaratorList_c  ::=  a_StructDeclaratorList_c   ','   a_StructDeclarator_c
a_StructDeclarator_c  ::=  a_Declarator_c   b_Attributes_c
a_StructDeclarator_c  ::=  a_Declarator_c   ':'   a_ConstantExpr_c   b_Attributes_c
a_StructDeclarator_c  ::=  ':'   a_ConstantExpr_c   b_Attributes_c
a_StructDeclarator_c  ::=  a_Declarator_c
a_StructDeclarator_c  ::=  a_Declarator_c   ':'   a_ConstantExpr_c
a_StructDeclarator_c  ::=  ':'   a_ConstantExpr_c
a_StructOrUnionSpecifier_c  ::=  a_StructOrUnion_c   a_Identifier_c   '{'    '}'
a_StructOrUnionSpecifier_c  ::=  a_StructOrUnion_c   '{'    '}'
a_StructOrUnionSpecifier_c  ::=  a_StructOrUnion_c   b_Attributes_c   a_Identifier_c   '{'    a_StructDeclarationList_c   '}'
a_StructOrUnionSpecifier_c  ::=  a_StructOrUnion_c   a_Identifier_c   '{'    a_StructDeclarationList_c   '}'   b_Attributes_c
a_StructOrUnionSpecifier_c  ::=  a_StructOrUnion_c   b_Attributes_c   a_Identifier_c   '{'    '}'
a_StructOrUnionSpecifier_c  ::=  a_StructOrUnion_c   a_Identifier_c   '{'    '}'   b_Attributes_c
a_StructOrUnionSpecifier_c  ::=  a_StructOrUnion_c   b_Attributes_c   '{'    '}'
a_StructOrUnionSpecifier_c  ::=  a_StructOrUnion_c   '{'    '}'   b_Attributes_c
a_StructOrUnionSpecifier_c  ::=  a_StructOrUnion_c   a_Identifier_c   '{'    a_StructDeclarationList_c   '}'
a_StructOrUnionSpecifier_c  ::=  a_StructOrUnion_c   '{'    a_StructDeclarationList_c   '}'
a_StructOrUnionSpecifier_c  ::=  a_StructOrUnion_c   a_Identifier_c
a_StructOrUnion_c  ::=  'struct'
a_StructOrUnion_c  ::=  'union'
a_TranslationUnit_c  ::=  a_TranslationUnit_c   ';'
a_TranslationUnit_c  ::=  a_ExternalDeclaration_c
a_TranslationUnit_c  ::=  a_TranslationUnit_c   a_ExternalDeclaration_c
a_TypeIdName_c  ::=  a_TypeName_t
a_TypeName_c  ::=  a_SpecifierQualifierList_c
a_TypeName_c  ::=  a_SpecifierQualifierList_c   a_AbstractDeclarator_c
a_TypeNames_c  ::=  a_TypeName_c   ','   a_TypeNames_c
a_TypeNames_c  ::=  a_TypeName_c
a_TypeNames_c  ::=
a_TypeQualifierList_c  ::=  b_Attributes_c   a_TypeQualifierList_c
a_TypeQualifierList_c  ::=  b_Attributes_c
a_TypeQualifierList_c  ::=  a_TypeQualifier_c
a_TypeQualifierList_c  ::=  a_TypeQualifier_c   a_TypeQualifierList_c
a_TypeQualifier_c  ::=  '_Atomic'
a_TypeQualifier_c  ::=  '__const'
a_TypeQualifier_c  ::=  '__restrict'
a_TypeQualifier_c  ::=  '__restrict__'
a_TypeQualifier_c  ::=  '__volatile__'
a_TypeQualifier_c  ::=  '__volatile'
a_TypeQualifier_c  ::=  'const'
a_TypeQualifier_c  ::=  'volatile'
a_TypeQualifier_c  ::=  'restrict'
a_TypeSpecifierItem_c  ::=  a_TypeSpecifier_c
a_TypeSpecifier_c  ::=  c_C11_Atomic_Specifier_t   a_TypeName_c   ')'
a_TypeSpecifier_c  ::=  '__builtin_va_list'
a_TypeSpecifier_c  ::=  '__signed__'
a_TypeSpecifier_c  ::=  b_TypeofStarter_c   '('   a_TypeName_c   ')'
a_TypeSpecifier_c  ::=  b_TypeofStarter_c   '('   a_Expr_c   ')'
a_TypeSpecifier_c  ::=  '_Float128'
a_TypeSpecifier_c  ::=  '__int128'
a_TypeSpecifier_c  ::=  'void'
a_TypeSpecifier_c  ::=  'char'
a_TypeSpecifier_c  ::=  'short'
a_TypeSpecifier_c  ::=  'int'
a_TypeSpecifier_c  ::=  'long'
a_TypeSpecifier_c  ::=  'float'
a_TypeSpecifier_c  ::=  'double'
a_TypeSpecifier_c  ::=  'signed'
a_TypeSpecifier_c  ::=  'unsigned'
a_TypeSpecifier_c  ::=  '_Bool'
a_TypeSpecifier_c  ::=  '_Imaginary'
a_TypeSpecifier_c  ::=  '_Complex'
a_TypeSpecifier_c  ::=  a_StructOrUnionSpecifier_c
a_TypeSpecifier_c  ::=  a_EnumSpecifier_c
a_TypeSpecifier_c  ::=  a_TypeIdName_c
a_UnaryExpr_c  ::=  '_Alignof'   '('   a_TypeName_c   ')'
a_UnaryExpr_c  ::=  '__alignof'   a_UnaryExpr_c
a_UnaryExpr_c  ::=  '__alignof'   '('   a_TypeName_c   ')'
a_UnaryExpr_c  ::=  '__alignof__'   a_UnaryExpr_c
a_UnaryExpr_c  ::=  '__alignof__'   '('   a_TypeName_c   ')'
a_UnaryExpr_c  ::=  '&&'   a_Identifier_c
a_UnaryExpr_c  ::=  a_PostfixExpr_c
a_UnaryExpr_c  ::=  '++'   a_UnaryExpr_c
a_UnaryExpr_c  ::=  '--'   a_UnaryExpr_c
a_UnaryExpr_c  ::=  a_UnaryOp_c   a_CastExpr_c
a_UnaryExpr_c  ::=  'sizeof'   a_UnaryExpr_c
a_UnaryExpr_c  ::=  'sizeof'   '('   a_TypeName_c   ')'
a_UnaryOp_c  ::=  '__extension__'
a_UnaryOp_c  ::=  '__real'
a_UnaryOp_c  ::=  '__real__'
a_UnaryOp_c  ::=  '__imag'
a_UnaryOp_c  ::=  '__imag__'
a_UnaryOp_c  ::=  '&'
a_UnaryOp_c  ::=  '*'
a_UnaryOp_c  ::=  '+'
a_UnaryOp_c  ::=  '-'
a_UnaryOp_c  ::=  '~'
a_UnaryOp_c  ::=  '!'
c_AlignmentSpecifier_c  ::=  '_Alignas'   '('   a_TypeName_c   ')'
c_AlignmentSpecifier_c  ::=  '_Alignas'   '('   a_ConstantExpr_c   ')'
c_GenericAssocList_c  ::=  c_GenericAssoc_c
c_GenericAssocList_c  ::=  c_GenericAssocList_c   ','   c_GenericAssoc_c
c_GenericAssoc_c  ::=  a_TypeName_c   ':'   a_AssignExpr_c
c_GenericAssoc_c  ::=  'default'   ':'   a_AssignExpr_c
c_GenericSelection_c  ::=  '_Generic'   '('   a_AssignExpr_c   ','   c_GenericAssocList_c   ')'
c_StaticAssertDeclaration_c  ::=  '_Static_assert'   '('   a_ConstantExpr_c   ','   a_StringConstant_c   ')'   ';'
b_AsmArgument_c  ::=  a_StringConstant_c   ':'   ':'   ':'   b_AsmClobbers_c
b_AsmArgument_c  ::=  a_StringConstant_c
b_AsmArgument_c  ::=  a_StringConstant_c   ':'   b_AsmOperands_c
b_AsmArgument_c  ::=  a_StringConstant_c   ':'
b_AsmArgument_c  ::=  a_StringConstant_c   ':'   b_AsmOperands_c   ':'   b_AsmOperands_c
b_AsmArgument_c  ::=  a_StringConstant_c   ':'   ':'   b_AsmOperands_c
b_AsmArgument_c  ::=  a_StringConstant_c   ':'   b_AsmOperands_c   ':'
b_AsmArgument_c  ::=  a_StringConstant_c   ':'   ':'
b_AsmArgument_c  ::=  a_StringConstant_c   ':'   b_AsmOperands_c   ':'   b_AsmOperands_c   ':'   b_AsmClobbers_c
b_AsmArgument_c  ::=  a_StringConstant_c   ':'   ':'   b_AsmOperands_c   ':'   b_AsmClobbers_c
b_AsmArgument_c  ::=  a_StringConstant_c   ':'   b_AsmOperands_c   ':'   ':'   b_AsmClobbers_c
b_AsmClobbers_c  ::=  a_StringConstant_t
b_AsmClobbers_c  ::=  b_AsmClobbers_c   ','   a_StringConstant_t
b_AsmOperand_c  ::=  a_StringConstant_t   '('   a_Expr_c   ')'
b_AsmOperand_c  ::=  '['   a_Identifier_c   ']'   a_StringConstant_t   '('   a_Expr_c   ')'
b_AsmOperands_c  ::=  b_AsmOperand_c
b_AsmOperands_c  ::=  b_AsmOperands_c   ','   b_AsmOperand_c
b_Asm_Starter_c  ::=  'asm'
b_Asm_Starter_c  ::=  '__asm__'
b_Asm_Starter_c  ::=  '__asm'
b_Asm_Statement_c  ::=  b_Asm_Starter_c   a_TypeQualifier_c   '('   b_AsmArgument_c   ')'   ';'
b_Asm_Statement_c  ::=  b_Asm_Starter_c   '('   b_AsmArgument_c   ')'   ';'
b_AttribName_c  ::=  b_AttributeNameUnfetterdByKeywords_t
b_Attrib_c  ::=
b_Attrib_c  ::=  b_AttribName_c
b_Attrib_c  ::=  b_AttribName_c   '('   a_ArgumentExprList_c   ')'
b_AttributeList_c  ::=  b_Attrib_c
b_AttributeList_c  ::=  b_AttributeList_c   ','   b_Attrib_c
b_Attribute_c  ::=  '__attribute__'   '('   '('   b_AttributeList_c   ')'   ')'
b_Attribute_c  ::=  '__attribute'   '('   '('   b_AttributeList_c   ')'   ')'
b_Attributes_c  ::=  b_Attribute_c
b_Attributes_c  ::=  b_Attribute_c   b_Attributes_c
b_InitialNestedFunctionDefinition_c  ::=  a_DeclarationSpecifiers_c   a_Declarator_c
b_LabelDeclaration_c  ::=  '__label__'   a_IdentifierList_c   ';'
b_LabelDeclarations_c  ::=  b_LabelDeclaration_c
b_LabelDeclarations_c  ::=  b_LabelDeclarations_c   b_LabelDeclaration_c
b_MemberDesignator_c  ::=  b_MemberDesignator_c   '->'   a_Identifier_c
b_MemberDesignator_c  ::=  b_MemberDesignator_c   '['   a_ConstantExpr_c   ']'
b_MemberDesignator_c  ::=  a_Identifier_c
b_MemberDesignator_c  ::=  b_MemberDesignator_c   '.'   a_Identifier_c
b_NestedFunctionDefinition_c  ::=  b_InitialNestedFunctionDefinition_c   a_CompoundStatement_c
b_SimpleAsmStatement_c  ::=  b_Asm_Starter_c   '('   a_StringConstant_c   ')'
b_TypeofStarter_c  ::=  'typeof'
b_TypeofStarter_c  ::=  '__typeof__'
b_TypeofStarter_c  ::=  '__typeof'

@ericvanwyk
Copy link
Contributor

Thanks for the interest and pointer to the railroad diagram maker. We'll take a look sometime - maybe at our next "hackathon".

@mingodad
Copy link
Author

mingodad commented Feb 10, 2023

Not at all and thanks for your great work !

And here is the manual fixes applied to the output of selfcompile silver that can be viewed at https://www.bottlecaps.de/rr/ui .

Copy and paste the EBNF shown bellow on https://www.bottlecaps.de/rr/ui on the tab Edit Grammar the click on the tab View Diagram to see/download a navigable railroad diagram.

grammar_start_at ::= b_Root
	| notes_for_railroad
notes_for_railroad ::=
	| 'a_ prefix for silver:compiler:definition:concrete_syntax:'
	| 'b_ prefix for silver:compiler:definition:core:'
	| 'c_ prefix for silver:compiler:modification:copper:'
	| 'd_ prefix for silver:regex:concrete_syntax:'
	| 'e_ prefix for silver:compiler:extension:easyterminal:'
	| 'f_ prefix for silver:compiler:definition:type:syntax:'
	| 'g_ prefix for silver:compiler:definition:flow:syntax:'
	| 'h_ prefix for silver:compiler:extension:convenience:'
	| 'i_ prefix for silver:compiler:modification:collection:'
	| 'j_ prefix for silver:compiler:extension:autoattr:'
	| 'k_ prefix for silver:compiler:extension:convenienceaspects:'
	| 'l_ prefix for silver:compiler:extension:patternmatching:'
	| 'm_ prefix for silver:compiler:extension:doc:core:'
	| 'n_ prefix for silver:compiler:extension:strategyattr:'
	| 'o_ prefix for silver:compiler:extension:treegen:'
	| 'p_ prefix for silver:compiler:modification:defaultattr:'
	| 'q_ prefix for silver:compiler:modification:ffi:'
	| 'r_ prefix for silver:reflect:concretesyntax:'
	| 's_ prefix for silver:compiler:extension:deprecation:'
	| 't_ prefix for silver:compiler:extension:do_notation:'
	| 'u_ prefix for silver:compiler:extension:templating:syntax:'
	| 'v_ prefix for silver:compiler:extension:tuple:'
	| 'w_ prefix for silver:compiler:modification:let_fix:'
	| 'x_ prefix for silver:compiler:modification:primitivepattern:'
a_ProductionModifier  ::=  'operator'   '='    b_QNameType
a_ProductionModifier  ::=  'precedence'   '='    b_Int_t
a_ProductionModifier  ::=  'layout'   '{'    c_TermList   '}'
a_ProductionModifier  ::=  'layout'   '{'    '}'
a_ProductionModifierList  ::=  a_ProductionModifier
a_ProductionModifierList  ::=  a_ProductionModifier   ','    a_ProductionModifierList
a_ProductionModifiers  ::=  a_ProductionModifierList
a_ProductionModifiers  ::=
a_RegExpr  ::=  '/'    d_Regex   '/'
a_RegExpr  ::=  e_Terminal_t
a_TerminalKeywordModifier  ::=  'ignore'
a_TerminalKeywordModifier  ::=  'marking'
a_TerminalKeywordModifier  ::=
a_TerminalModifier  ::=  'association'   '='    'left'
a_TerminalModifier  ::=  'named'   b_String_t
a_TerminalModifier  ::=  'precedence'   '='    b_Int_t
a_TerminalModifier  ::=  'repeatProb'   '='    b_Float_t
a_TerminalModifier  ::=  'association'   '='    'right'
a_TerminalModifier  ::=  'action'   c_ActionCode_c
a_TerminalModifier  ::=  'lexer'   'classes'   c_LexerClasses
a_TerminalModifier  ::=  'dominates'   c_TermPrecs
a_TerminalModifier  ::=  'submits'   'to'   c_TermPrecs
a_TerminalModifiers  ::=  a_TerminalModifier
a_TerminalModifiers  ::=  a_TerminalModifier   ','    a_TerminalModifiers
b_AGDcl  ::=  'concrete'   'production'   b_Name   b_ProductionSignature   a_ProductionModifiers   b_ProductionBody
b_AGDcl  ::=  a_TerminalKeywordModifier   'terminal'    b_Name   a_RegExpr   a_TerminalModifiers   ';'
b_AGDcl  ::=  a_TerminalKeywordModifier   'terminal'    b_Name   a_RegExpr   ';'
b_AGDcl  ::=  'annotation'   b_QName   f_BracketedOptTypeExprs   'occurs'   'on'   b_QName   f_BracketedOptTypeExprs   ';'
b_AGDcl  ::=  'annotation'   b_QName   f_BracketedOptTypeExprs   '::'    f_TypeExpr   ';'
b_AGDcl  ::=  'aspect'   'function'   b_QName   b_AspectFunctionSignature   b_ProductionBody
b_AGDcl  ::=  'aspect'   'production'   b_QName   b_AspectProductionSignature   b_ProductionBody
b_AGDcl  ::=  'inherited'   'attribute'   b_Name   f_BracketedOptTypeExprs   '::'    f_TypeExpr   ';'
b_AGDcl  ::=  'synthesized'   'attribute'   b_Name   f_BracketedOptTypeExprs   '::'    f_TypeExpr   ';'
b_AGDcl  ::=  'attribute'   b_QName   f_BracketedOptTypeExprs   'occurs'   'on'   b_QName   f_BracketedOptTypeExprs   ';'
b_AGDcl  ::=  'function'   b_Name   b_FunctionSignature   b_ProductionBody
b_AGDcl  ::=  'global'   b_Name   '::'    f_ConstraintList   '=>'   f_TypeExpr   '='    b_Expr   ';'
b_AGDcl  ::=  'global'   b_Name   '::'    f_TypeExpr   '='    b_Expr   ';'
b_AGDcl  ::=  'instance'   f_ConstraintList   '=>'   b_QNameType   f_TypeExpr   '{'    b_InstanceBody   '}'
b_AGDcl  ::=  'instance'   b_QNameType   f_TypeExpr   '{'    b_InstanceBody   '}'
b_AGDcl  ::=  b_NTDeclQualifiers   'nonterminal'   b_Name   f_BracketedOptTypeExprs   b_NonterminalModifiers   ';'
b_AGDcl  ::=  'abstract'   'production'   b_Name   b_ProductionSignature   b_ProductionBody
b_AGDcl  ::=  'type'   b_Name   f_BracketedOptTypeExprs   '='    f_TypeExpr   ';'
b_AGDcl  ::=  'class'   f_ConstraintList   '=>'   b_QNameType   f_TypeExpr   '{'    b_ClassBody   '}'
b_AGDcl  ::=  'class'   b_QNameType   f_TypeExpr   '{'    b_ClassBody   '}'
b_AGDcl  ::=  'flowtype'   g_FlowSpec   'on'   g_NtList   ';'
b_AGDcl  ::=  'flowtype'   b_QName   '='    g_FlowSpecs   ';'
b_AGDcl  ::=  'destruct'   'attribute'   b_Name   'occurs'   'on'   h_QNames   ';'
b_AGDcl  ::=  'equality'   'attribute'   b_Name   ','    b_Name   ';'
b_AGDcl  ::=  'equality'   'attribute'   b_Name   ','    b_Name   'occurs'   'on'   h_QNames   ';'
b_AGDcl  ::=  'ordering'   'attribute'   b_Name   ','    b_Name   ','    b_Name   ';'
b_AGDcl  ::=  'ordering'   'attribute'   b_Name   ','    b_Name   ','    b_Name   'occurs'   'on'   h_QNames   ';'
b_AGDcl  ::=  'equality'   'attribute'   b_Name   'with'   b_QName   'occurs'   'on'   h_QNames   ';'
b_AGDcl  ::=  'functor'   'attribute'   b_Name   'occurs'   'on'   h_QNames   ';'
b_AGDcl  ::=  'monoid'   'attribute'   b_Name   f_BracketedOptTypeExprs   '::'    f_TypeExpr   'with'   b_Expr   ','    i_NameOrBOperator   'occurs'   'on'   h_QNames   ';'
b_AGDcl  ::=  'ordering'   'attribute'   b_Name   ','    b_Name   'with'   b_QName   'occurs'   'on'   h_QNames   ';'
b_AGDcl  ::=  'monoid'   'attribute'   b_Name   f_BracketedOptTypeExprs   '::'    f_TypeExpr   'occurs'   'on'   h_QNames   ';'
b_AGDcl  ::=  'threaded'   'attribute'   b_Name   ','    b_Name   f_BracketedOptTypeExprs   '::'    f_TypeExpr   'occurs'   'on'   h_QNames   j_OptDirectionMod   ';'
b_AGDcl  ::=  'unification'   'attribute'   b_Name   ','    b_Name   'with'   b_QName   'occurs'   'on'   h_QNames   ';'
b_AGDcl  ::=  'destruct'   'attribute'   b_Name   ';'
b_AGDcl  ::=  'equality'   'attribute'   b_Name   'with'   b_QName   ';'
b_AGDcl  ::=  'functor'   'attribute'   b_Name   ';'
b_AGDcl  ::=  'monoid'   'attribute'   b_Name   f_BracketedOptTypeExprs   '::'    f_TypeExpr   'with'   b_Expr   ','    i_NameOrBOperator   ';'
b_AGDcl  ::=  'ordering'   'attribute'   b_Name   ','    b_Name   'with'   b_QName   ';'
b_AGDcl  ::=  'propagate'   b_NameList   'on'   b_NameList   ';'
b_AGDcl  ::=  'propagate'   b_NameList   'on'   b_NameList   'excluding'   j_ProdNameList   ';'
b_AGDcl  ::=  'monoid'   'attribute'   b_Name   f_BracketedOptTypeExprs   '::'    f_TypeExpr   ';'
b_AGDcl  ::=  'threaded'   'attribute'   b_Name   ','    b_Name   f_BracketedOptTypeExprs   '::'    f_TypeExpr   j_OptDirectionMod   ';'
b_AGDcl  ::=  'unification'   'attribute'   b_Name   ','    b_Name   'with'   b_QName   ';'
b_AGDcl  ::=  'inherited'   'attribute'   b_Name   f_BracketedOptTypeExprs   '::'    f_TypeExpr   'occurs'   'on'   h_QNames   ';'
b_AGDcl  ::=  'synthesized'   'attribute'   b_Name   f_BracketedOptTypeExprs   '::'    f_TypeExpr   'occurs'   'on'   h_QNames   ';'
b_AGDcl  ::=  'inherited'   'attribute'   b_Name   f_BracketedOptTypeExprs   '::'    f_TypeExpr   'with'   i_NameOrBOperator   'occurs'   'on'   h_QNames   ';'
b_AGDcl  ::=  'synthesized'   'attribute'   b_Name   f_BracketedOptTypeExprs   '::'    f_TypeExpr   'with'   i_NameOrBOperator   'occurs'   'on'   h_QNames   ';'
b_AGDcl  ::=  'annotation'   h_QNames2   'occurs'   'on'   h_QNames2   ';'
b_AGDcl  ::=  'annotation'   h_QNames2   'occurs'   'on'   h_QNameWithTL   ';'
b_AGDcl  ::=  'annotation'   b_QName   f_BracketedOptTypeExprs   'occurs'   'on'   h_QNames2   ';'
b_AGDcl  ::=  'attribute'   h_QNames2   'occurs'   'on'   h_QNames2   ';'
b_AGDcl  ::=  'attribute'   h_QNames2   'occurs'   'on'   h_QNameWithTL   ';'
b_AGDcl  ::=  'attribute'   b_QName   f_BracketedOptTypeExprs   'occurs'   'on'   h_QNames2   ';'
b_AGDcl  ::=  b_NTDeclQualifiers   'nonterminal'   b_Name   f_BracketedOptTypeExprs   b_NonterminalModifiers   'with'   h_QNames   ';'
b_AGDcl  ::=  'concrete'   'productions'   b_ProductionLHS   h_ProductionDclStmts
b_AGDcl  ::=  'production'   b_Name   b_ProductionSignature   b_ProductionBody
b_AGDcl  ::=  'aspect'   b_QNameAttrOccur   'on'   k_ConvAspectLHS   k_ConvenienceAspectEquationKind   'of'   l_Opt_Vbar_t   l_MRuleList   'end'   ';'
b_AGDcl  ::=  'deprecated'   b_String_t   ';'
b_AGDcl  ::=  m_DocComment_t   b_AGDcl
b_AGDcl  ::=  '@'    m_DocComment_t
b_AGDcl  ::=  'implicit'   'inherited'   'attribute'   b_Name   f_BracketedOptTypeExprs   '::'    f_TypeExpr   ';'
b_AGDcl  ::=  'restricted'   'inherited'   'attribute'   b_Name   f_BracketedOptTypeExprs   '::'    f_TypeExpr   ';'
b_AGDcl  ::=  'unrestricted'   'inherited'   'attribute'   b_Name   f_BracketedOptTypeExprs   '::'    f_TypeExpr   ';'
b_AGDcl  ::=  'implicit'   'synthesized'   'attribute'   b_Name   f_BracketedOptTypeExprs   '::'    f_TypeExpr   ';'
b_AGDcl  ::=  'restricted'   'synthesized'   'attribute'   b_Name   f_BracketedOptTypeExprs   '::'    f_TypeExpr   ';'
b_AGDcl  ::=  'unrestricted'   'synthesized'   'attribute'   b_Name   f_BracketedOptTypeExprs   '::'    f_TypeExpr   ';'
b_AGDcl  ::=  'partial'   'strategy'   'attribute'   b_Name   '='    n_StrategyExpr_c   'occurs'   'on'   h_QNames   ';'
b_AGDcl  ::=  'strategy'   'attribute'   b_Name   '='    n_StrategyExpr_c   'occurs'   'on'   h_QNames   ';'
b_AGDcl  ::=  'partial'   'strategy'   'attribute'   b_Name   '='    n_StrategyExpr_c   ';'
b_AGDcl  ::=  'strategy'   'attribute'   b_Name   '='    n_StrategyExpr_c   ';'
b_AGDcl  ::=  'equalityTest'   '('    b_Expr   ','    b_Expr   ','    f_TypeExpr   ','    b_Name   ')'    ';'
b_AGDcl  ::=  'mainTestSuite'   b_IdLower_t   ';'
b_AGDcl  ::=  'makeTestSuite'   b_IdLower_t   ';'
b_AGDcl  ::=  'noWarnCode'   b_String_t   '{'    b_AGDcls   '}'
b_AGDcl  ::=  'warnCode'   b_String_t   '{'    b_AGDcls   '}'
b_AGDcl  ::=  'wrongCode'   b_String_t   '{'    b_AGDcls   '}'
b_AGDcl  ::=  'wrongFlowCode'   b_String_t   '{'    b_AGDcls   '}'
b_AGDcl  ::=  'generator'   b_Name   '::'    f_TypeExpr   '{'    o_GeneratorComponents   '}'
b_AGDcl  ::=  'inherited'   'attribute'   b_Name   f_BracketedOptTypeExprs   '::'    f_TypeExpr   'with'   i_NameOrBOperator   ';'
b_AGDcl  ::=  'synthesized'   'attribute'   b_Name   f_BracketedOptTypeExprs   '::'    f_TypeExpr   'with'   i_NameOrBOperator   ';'
b_AGDcl  ::=  'aspect'   'parser'   'attribute'   b_QName   'action'   c_ActionCode_c   ';'
b_AGDcl  ::=  'parser'   'attribute'   b_Name   '::'    f_TypeExpr   'action'   c_ActionCode_c   ';'
b_AGDcl  ::=  'concrete'   'production'   b_Name   b_ProductionSignature   a_ProductionModifiers   b_ProductionBody   'action'   c_ActionCode_c
b_AGDcl  ::=  'disambiguate'   c_TermList   c_ActionCode_c
b_AGDcl  ::=  'lexer'   'class'   b_Name   ';'
b_AGDcl  ::=  'lexer'   'class'   b_Name   c_LexerClassModifiers   ';'
b_AGDcl  ::=  'copper_mda'   b_Name   '('    b_QName   ')'    '{'    c_ParserComponents   '}'
b_AGDcl  ::=  'parser'   b_Name   '::'    f_TypeExpr   '{'    c_ParserComponents   '}'
b_AGDcl  ::=  'aspect'   'default'   'production'   p_AspectDefaultProductionSignature   b_ProductionBody
b_AGDcl  ::=  'type'   b_Name   f_BracketedOptTypeExprs   'foreign'   ';'
b_AGDcl  ::=  'type'   b_Name   f_BracketedOptTypeExprs   'foreign'   '='    b_String_t   ';'
b_AGDcl  ::=  'function'   b_Name   b_FunctionSignature   b_ProductionBody   'foreign'   '{'    q_FFIDefs   '}'
b_AGDcls  ::=  b_AGDcl   b_AGDcls
b_AGDcls  ::=
b_AnnoAppExprs  ::=  b_AnnoExpr
b_AnnoAppExprs  ::=  b_AnnoAppExprs   ','    b_AnnoExpr
b_AnnoExpr  ::=  b_QName   '='    b_AppExpr
b_AppExpr  ::=  '_'
b_AppExpr  ::=  b_Expr
b_AppExprs  ::=  b_AppExpr
b_AppExprs  ::=  b_AppExprs   ','    b_AppExpr
b_AspectFunctionLHS  ::=  f_TypeExpr
b_AspectFunctionSignature  ::=  b_AspectFunctionLHS   '::='   b_AspectRHS
b_AspectProductionLHS  ::=  b_Name
b_AspectProductionLHS  ::=  '_'
b_AspectProductionLHS  ::=  b_Name   '::'    f_TypeExpr
b_AspectProductionSignature  ::=  b_AspectProductionLHS   '::='   b_AspectRHS
b_AspectRHS  ::=  b_AspectRHSElem   b_AspectRHS
b_AspectRHS  ::=
b_AspectRHS  ::=  '$AspectRHS'   '{'    b_Expr   '}'
b_AspectRHSElem  ::=  b_Name
b_AspectRHSElem  ::=  '_'
b_AspectRHSElem  ::=  b_Name   '::'    f_TypeExpr
b_AspectRHSElem  ::=  e_EasyTerminalRef
b_AspectRHSElem  ::=  b_Name   '::'    e_EasyTerminalRef
b_ClassBody  ::=  b_ClassBodyItem   b_ClassBody
b_ClassBody  ::=
b_ClassBodyItem  ::=  b_Name   '::'    f_TypeExpr   ';'
b_ClassBodyItem  ::=  b_Name   '::'    f_ConstraintList   '=>'   f_TypeExpr   ';'
b_ClassBodyItem  ::=  b_Name   '::'    f_TypeExpr   '='    b_Expr   ';'
b_ClassBodyItem  ::=  b_Name   '::'    f_ConstraintList   '=>'   f_TypeExpr   '='    b_Expr   ';'
b_ClassBodyItem  ::=  m_DocComment_t   b_ClassBodyItem
b_DefLHS  ::=  b_QName
b_DefLHS  ::=  'forward'
b_Expr  ::=  b_Expr   '.'    b_QNameAttrOccur
b_Expr  ::=  b_Expr   '&&'   b_Expr
b_Expr  ::=  b_Expr   '('    b_AppExprs   ','    b_AnnoAppExprs   ')'
b_Expr  ::=  b_Expr   '('    b_AnnoAppExprs   ')'
b_Expr  ::=  b_Expr   '('    ')'
b_Expr  ::=  b_Expr   '('    b_AppExprs   ')'
b_Expr  ::=  b_QName
b_Expr  ::=  'forward'
b_Expr  ::=  'decorate'   b_Expr   'with'   '{'    b_ExprInhs   '}'
b_Expr  ::=  'decorate'   b_Expr   'with'   '{'    '}'
b_Expr  ::=  '@'    b_Expr
b_Expr  ::=  b_Expr   '/'    b_Expr
b_Expr  ::=  b_Expr   '=='   b_Expr
b_Expr  ::=  'false'
b_Expr  ::=  b_Float_t
b_Expr  ::=  b_Expr   '.'    'forward'
b_Expr  ::=  b_Expr   '>'   b_Expr
b_Expr  ::=  b_Expr   '>='   b_Expr
b_Expr  ::=  'if'   b_Expr   'then'   b_Expr   'else'   b_Expr
b_Expr  ::=  b_Int_t
b_Expr  ::=  b_Expr   '<'   b_Expr
b_Expr  ::=  b_Expr   '<='   b_Expr
b_Expr  ::=  b_Expr   '-'    b_Expr
b_Expr  ::=  b_Expr   '%'   b_Expr
b_Expr  ::=  b_Expr   '*'    b_Expr
b_Expr  ::=  '-'    b_Expr
b_Expr  ::=  b_Expr   '!='   b_Expr
b_Expr  ::=  '('    b_Expr   ')'
b_Expr  ::=  '!'   b_Expr
b_Expr  ::=  'attachNote'   b_Expr   'on'   b_Expr   'end'
b_Expr  ::=  b_Expr   '||'   b_Expr
b_Expr  ::=  b_Expr   '+'    b_Expr
b_Expr  ::=  b_Expr   '++'   b_Expr
b_Expr  ::=  b_String_t
b_Expr  ::=  'terminal'    '('    f_TypeExpr   ','    b_Expr   ','    b_Expr   ')'
b_Expr  ::=  'terminal'    '('    f_TypeExpr   ','    b_Expr   ')'
b_Expr  ::=  'true'
b_Expr  ::=  'AST'   '{'    r_AST_c   '}'
b_Expr  ::=  '('    '.'    b_QNameAttrOccur   ')'
b_Expr  ::=  '$'    b_Int_t
b_Expr  ::=  s_NameTick
b_Expr  ::=  s_NameTickTick
b_Expr  ::=  'do'   '{'    t_DoBody   '}'
b_Expr  ::=  'mdo'   '{'    t_DoBody   '}'
b_Expr  ::=  e_EasyTerminalRef
b_Expr  ::=  'if'   b_Expr   'then'   b_Expr   'end'
b_Expr  ::=  'case_any'   b_Exprs   'of'   l_Opt_Vbar_t   l_MRuleList   'end'
b_Expr  ::=  'case'   b_Exprs   'of'   l_Opt_Vbar_t   l_MRuleList   'end'
b_Expr  ::=  '/'    d_Regex   '/'
b_Expr  ::=  b_Expr   '=~'   b_Expr
b_Expr  ::=  b_Expr   '<+'    b_Expr
b_Expr  ::=  'rule'    'on'   f_TypeExpr   'of'   l_Opt_Vbar_t   l_MRuleList   'end'
b_Expr  ::=  b_Expr   '<*'    b_Expr
b_Expr  ::=  'traverse'   '('    '_'   '::'    b_AppExpr   ')'
b_Expr  ::=  'traverse'   '('    b_Expr   '::'    b_AppExpr   ')'
b_Expr  ::=  'traverse'   '['    b_AppExprs   ']'
b_Expr  ::=  'traverse'   '['    ']'
b_Expr  ::=  'traverse'   b_QName   '('    b_AnnoAppExprs   ')'
b_Expr  ::=  'traverse'   b_QName   '('    ')'
b_Expr  ::=  'traverse'   b_QName   '('    b_AppExprs   ')'
b_Expr  ::=  'traverse'   b_QName   '('    b_AppExprs   ','    b_AnnoAppExprs   ')'
b_Expr  ::=  '$Expr'   '{'    b_Expr   '}'
b_Expr  ::=  'Silver_AGDcl'   '{'    b_AGDcl   '}'
b_Expr  ::=  'Silver_Expr'   '{'    b_Expr   '}'
b_Expr  ::=  'Silver_ExprInh'   '{'    b_ExprInh   '}'
b_Expr  ::=  'Silver_Pattern'   '{'    l_Pattern   '}'
b_Expr  ::=  'Silver_ProductionStmt'   '{'    b_ProductionStmt   '}'
b_Expr  ::=  'Silver_TypeExpr'   '{'    f_TypeExpr   '}'
b_Expr  ::=  'Silver_StrategyExpr'   '('    b_Expr   ')'    '{'    n_StrategyExpr_c   '}'
b_Expr  ::=  'pp"""'   u_TemplateString
b_Expr  ::=  's"'   u_SingleLineTemplateString
b_Expr  ::=  'pp"'   u_SingleLineTemplateString
b_Expr  ::=  's"""'   u_TemplateString
b_Expr  ::=  'genArbTerminal'   '('    f_TypeExpr   ','    b_Expr   ')'
b_Expr  ::=  'genArbTerminal'   '('    f_TypeExpr   ','    '_'   ')'
b_Expr  ::=  '('    ')'
b_Expr  ::=  b_Expr   '.'    v_IntConst
b_Expr  ::=  '('    v_TupleList   ')'
b_Expr  ::=  'disambiguationFailure'
b_Expr  ::=  '\'    b_ProductionRHS   '->'    b_Expr
b_Expr  ::=  'let'   w_LetAssigns   'in'   b_Expr   'end'
b_Expr  ::=  b_Expr   '::'    b_Expr
b_Expr  ::=  '['    ']'
b_Expr  ::=  '['    b_Exprs   ']'
b_Expr  ::=  'match'   b_Expr   'return'   f_TypeExpr   'with'   x_PrimPatterns   'else'   '->'    b_Expr   'end'
b_ExprInh  ::=  b_ExprLHSExpr   '='    b_Expr   ';'
b_ExprInhs  ::=  b_ExprInh   b_ExprInhs
b_ExprInhs  ::=  b_ExprInh
b_ExprInhs  ::=  '$ExprInhs'   '{'    b_Expr   '}'
b_ExprLHSExpr  ::=  b_QNameAttrOccur
b_Exprs  ::=  b_Expr   ','    b_Exprs
b_Exprs  ::=  b_Expr
b_ForwardInh  ::=  b_ForwardLHSExpr   '='    b_Expr   ';'
b_ForwardInhs  ::=  b_ForwardInh   b_ForwardInhs
b_ForwardInhs  ::=  b_ForwardInh
b_ForwardLHSExpr  ::=  b_QNameAttrOccur
b_FunctionLHS  ::=  f_TypeExpr
b_FunctionSignature  ::=  f_ConstraintList   '=>'   b_FunctionLHS   '::='   b_ProductionRHS
b_FunctionSignature  ::=  b_FunctionLHS   '::='   b_ProductionRHS
b_GrammarDcl  ::=  'grammar'   b_QName   ';'
b_GrammarDcl  ::=
b_ImportStmt  ::=  'import'   b_ModuleExpr   ';'
b_ImportStmts  ::=  b_ImportStmt   b_ImportStmts
b_ImportStmts  ::=
b_InstanceBody  ::=  b_InstanceBodyItem   b_InstanceBody
b_InstanceBody  ::=
b_InstanceBodyItem  ::=  b_QName   '='    b_Expr   ';'
b_InstanceBodyItem  ::=  m_DocComment_t   b_InstanceBodyItem
b_ModuleExpr  ::=  b_QName
b_ModuleExpr  ::=  b_QName   'with'   b_WithElems
b_ModuleExpr  ::=  b_QName   'as'   b_QName
b_ModuleExpr  ::=  b_QName   'hiding'   b_NameList
b_ModuleExpr  ::=  b_QName   'hiding'   b_NameList   'with'   b_WithElems
b_ModuleExpr  ::=  b_QName   'only'   b_NameList
b_ModuleExpr  ::=  b_QName   'only'   b_NameList   'with'   b_WithElems
b_ModuleName  ::=  b_QName
b_ModuleStmt  ::=  'exports'   b_ModuleName   ';'
b_ModuleStmt  ::=  'exports'   b_QName   'with'   b_QName   ';'
b_ModuleStmt  ::=  'imports'   b_ModuleExpr   ';'
b_ModuleStmt  ::=  'option'   b_QName   ';'
b_ModuleStmt  ::=  'build'   b_QName   'with'   b_QName   ';'
b_ModuleStmts  ::=  b_ModuleStmt   b_ModuleStmts
b_ModuleStmts  ::=
b_NTDeclQualifiers  ::=  'closed'   b_NTDeclQualifiers
b_NTDeclQualifiers  ::=
b_NTDeclQualifiers  ::=  'tracked'   b_NTDeclQualifiers
b_Name  ::=  b_IdLower_t
b_Name  ::=  b_IdUpper_t
b_Name  ::=  '$Name'   '{'    b_Expr   '}'
b_Name  ::=  '$name'   '{'    b_Expr   '}'
b_Name  ::=  'pluck'
b_Name  ::=  'print'
b_NameList  ::=  b_QName   ','    b_NameList
b_NameList  ::=  b_QName
b_NonterminalModifier  ::=  'layout'   '{'    c_TermList   '}'
b_NonterminalModifier  ::=  'layout'   '{'    '}'
b_NonterminalModifierList  ::=  b_NonterminalModifier
b_NonterminalModifierList  ::=  b_NonterminalModifier   ','    b_NonterminalModifierList
b_NonterminalModifiers  ::=  b_NonterminalModifierList
b_NonterminalModifiers  ::=
b_ProductionBody  ::=  '{'    b_ProductionStmts   '}'
b_ProductionBody  ::=  ';'
b_ProductionLHS  ::=  b_Name   '::'    f_TypeExpr
b_ProductionRHS  ::=  b_ProductionRHSElem   b_ProductionRHS
b_ProductionRHS  ::=
b_ProductionRHSElem  ::=  b_Name   '::'    f_TypeExpr
b_ProductionRHSElem  ::=  f_TypeExpr
b_ProductionRHSElem  ::=  b_Name   '::'    e_EasyTerminalRef
b_ProductionRHSElem  ::=  e_EasyTerminalRef
b_ProductionSignature  ::=  f_ConstraintList   '=>'   b_ProductionLHS   '::='   b_ProductionRHS
b_ProductionSignature  ::=  b_ProductionLHS   '::='   b_ProductionRHS
b_ProductionStmt  ::=  'attachNote'   b_Expr   ';'
b_ProductionStmt  ::=  b_DefLHS   '.'    b_QNameAttrOccur   '='    b_Expr   ';'
b_ProductionStmt  ::=  'forwarding'   'with'   '{'    b_ForwardInhs   '}'   ';'
b_ProductionStmt  ::=  'forwards'   'to'   b_Expr   ';'
b_ProductionStmt  ::=  'forwards'   'to'   b_Expr   'with'   '{'    b_ForwardInhs   '}'   ';'
b_ProductionStmt  ::=  'local'   'attribute'   b_Name   '::'    f_TypeExpr   ';'
b_ProductionStmt  ::=  'production'   'attribute'   b_Name   '::'    f_TypeExpr   ';'
b_ProductionStmt  ::=  'return'   b_Expr   ';'
b_ProductionStmt  ::=  'undecorates'   'to'   b_Expr   ';'
b_ProductionStmt  ::=  b_QName   '='    b_Expr   ';'
b_ProductionStmt  ::=  'abstract'   b_QName   ';'
b_ProductionStmt  ::=  'propagate'   b_NameList   ';'
b_ProductionStmt  ::=  'thread'   b_QName   ','    b_QName   'on'   j_ChildNameList   ';'
b_ProductionStmt  ::=  'local'   b_Name   '::'    f_TypeExpr   '='    b_Expr   ';'
b_ProductionStmt  ::=  'local'   'attribute'   b_Name   '::'    f_TypeExpr   '='    b_Expr   ';'
b_ProductionStmt  ::=  'production'   b_Name   '::'    f_TypeExpr   '='    b_Expr   ';'
b_ProductionStmt  ::=  'production'   'attribute'   b_Name   '::'    f_TypeExpr   '='    b_Expr   ';'
b_ProductionStmt  ::=  'implicit'   b_DefLHS   '.'    b_QNameAttrOccur   '='    ';'
b_ProductionStmt  ::=  'implicit'   b_DefLHS   '.'    b_QNameAttrOccur   '='    b_Expr   ';'
b_ProductionStmt  ::=  'restricted'   b_DefLHS   '.'    b_QNameAttrOccur   '='    b_Expr   ';'
b_ProductionStmt  ::=  'unrestricted'   b_DefLHS   '.'    b_QNameAttrOccur   '='    b_Expr   ';'
b_ProductionStmt  ::=  '$ProductionStmt'   '{'    b_Expr   '}'
b_ProductionStmt  ::=  b_DefLHS   '.'    b_QNameAttrOccur   '<-'    b_Expr   ';'
b_ProductionStmt  ::=  b_DefLHS   '.'    b_QNameAttrOccur   ':='   b_Expr   ';'
b_ProductionStmt  ::=  'production'   'attribute'   b_Name   '::'    f_TypeExpr   'with'   i_NameOrBOperator   ';'
b_ProductionStmt  ::=  b_QName   '<-'    b_Expr   ';'
b_ProductionStmt  ::=  b_QName   ':='   b_Expr   ';'
b_ProductionStmt  ::=  '{'    b_ProductionStmts   '}'
b_ProductionStmt  ::=  'if'   '('    b_Expr   ')'    b_ProductionStmt   'else'   b_ProductionStmt
b_ProductionStmt  ::=  'if'   '('    b_Expr   ')'    b_ProductionStmt
b_ProductionStmt  ::=  'insert'   'semantic'   'token'   b_QNameType   'at'   b_Expr   ';'
b_ProductionStmt  ::=  'pluck'   b_Expr   ';'
b_ProductionStmt  ::=  'print'   b_Expr   ';'
b_ProductionStmt  ::=  'pushToken'   '('    b_QName   ','    b_Expr   ')'    ';'
b_ProductionStmts  ::=
b_ProductionStmts  ::=  b_ProductionStmts   b_ProductionStmt
b_QName  ::=  b_Name   ':'    b_QName
b_QName  ::=  b_Name
b_QName  ::=  '$QName'   '{'    b_Expr   '}'
b_QName  ::=  '$qName'   '{'    b_Expr   '}'
b_QNameAttrOccur  ::=  b_QName
b_QNameAttrOccur  ::=  '$QNameAttrOccur'   '{'    b_Expr   '}'
b_QNameType  ::=  b_Name   ':'    b_QNameType
b_QNameType  ::=  b_IdUpper_t
b_Root  ::=  b_GrammarDcl   b_ModuleStmts   b_ImportStmts   b_AGDcls
b_Root  ::=  b_GrammarDcl   b_ModuleStmts   b_ImportStmts   'construct'   b_Name   'as'   b_QName   'translator'   'using'   c_ParserComponents
b_WithElem  ::=  b_QName   'as'   b_QName
b_WithElems  ::=  b_WithElem   ','    b_WithElems
b_WithElems  ::=  b_WithElem
g_FlowSpec  ::=  g_FlowSpecId   '{'    g_FlowSpecInhs   '}'
g_FlowSpecId  ::=  'decorate'
g_FlowSpecId  ::=  'forward'
g_FlowSpecId  ::=  b_QNameAttrOccur
g_FlowSpecInh  ::=  'decorate'
g_FlowSpecInh  ::=  'forward'
g_FlowSpecInh  ::=  b_QNameAttrOccur
g_FlowSpecInhs  ::=  g_FlowSpecInh   ','    g_FlowSpecInhs
g_FlowSpecInhs  ::=
g_FlowSpecInhs  ::=  g_FlowSpecInh
g_FlowSpecs  ::=  g_FlowSpec
g_FlowSpecs  ::=  g_FlowSpecs   ','    g_FlowSpec
g_NtList  ::=  g_NtName   ','    g_NtList
g_NtList  ::=
g_NtList  ::=  g_NtName
g_NtName  ::=  b_QName
f_BracketedOptTypeExprs  ::=
f_BracketedOptTypeExprs  ::=  f_BracketedTypeExprs
f_BracketedTypeExprs  ::=  '<'   f_TypeExprs   '>'
f_Constraint  ::=  'annotation'   b_QName   f_BracketedOptTypeExprs   'occurs'   'on'   f_TypeExpr
f_Constraint  ::=  b_QNameType   f_TypeExpr
f_Constraint  ::=  'attribute'   b_QName   f_BracketedOptTypeExprs   'occurs'   'on'   f_TypeExpr
f_Constraint  ::=  f_TypeExpr   'subset'   f_TypeExpr
f_Constraint  ::=  'attribute'   b_QName   f_BracketedOptTypeExprs   f_TypeExpr   'occurs'   'on'   f_TypeExpr
f_Constraint  ::=  'typeError'   b_String_t
f_Constraint  ::=  'runtimeTypeable'   f_TypeExpr
f_ConstraintList  ::=  f_Constraint   ','    f_ConstraintList
f_ConstraintList  ::=  f_Constraint
f_KindExpr  ::=  f_KindExpr   '->'    f_KindExpr
f_KindExpr  ::=  'InhSet'
f_KindExpr  ::=  '('    f_KindExpr   ')'
f_KindExpr  ::=  '*'
f_Signature  ::=  f_SignatureLHS   '::='   f_TypeExprs
f_Signature  ::=  f_SignatureLHS   '::='
f_SignatureLHS  ::=  '_'
f_SignatureLHS  ::=  f_TypeExpr
f_TypeExpr  ::=  f_TypeExpr   f_BracketedTypeExprs
f_TypeExpr  ::=  'Boolean'
f_TypeExpr  ::=  'Float'
f_TypeExpr  ::=  '('    f_Signature   ')'
f_TypeExpr  ::=  '{'    g_FlowSpecInhs   '}'
f_TypeExpr  ::=  'Integer'
f_TypeExpr  ::=  '('    b_IdLower_t   '::'    f_KindExpr   ')'
f_TypeExpr  ::=  b_QNameType
f_TypeExpr  ::=  'Decorated'   f_TypeExpr
f_TypeExpr  ::=  'Decorated'   f_TypeExpr   'with'   f_TypeExpr
f_TypeExpr  ::=  'String'
f_TypeExpr  ::=  'TerminalId'
f_TypeExpr  ::=  b_IdLower_t
f_TypeExpr  ::=  'Decorated!'   f_TypeExpr
f_TypeExpr  ::=  'Decorated!'   f_TypeExpr   'with'   f_TypeExpr
f_TypeExpr  ::=  '$TypeExpr'   '{'    b_Expr   '}'
f_TypeExpr  ::=  '('    ')'
f_TypeExpr  ::=  '('    v_ListOfTypeExprs   ')'
f_TypeExpr  ::=  '['    ']'
f_TypeExpr  ::=  '['    f_TypeExpr   ']'
f_TypeExprs  ::=  f_TypeExpr   f_TypeExprs
f_TypeExprs  ::=  '_'   f_TypeExprs
f_TypeExprs  ::=  f_TypeExpr
f_TypeExprs  ::=  '_'
j_ChildName  ::=  'forward'
j_ChildName  ::=  b_Name
j_ChildNameList  ::=  j_ChildName   ','    j_ChildNameList
j_ChildNameList  ::=  j_ChildName
j_Direction  ::=  'left'   'to'   'right'
j_Direction  ::=  'right'   'to'   'left'
j_OptDirectionMod  ::=  'direction'   '='    j_Direction
j_OptDirectionMod  ::=
j_ProdNameList  ::=  b_QName   ','    j_ProdNameList
j_ProdNameList  ::=  b_QName
h_OptionalAction  ::=  'action'   c_ActionCode_c
h_OptionalAction  ::=
h_OptionalName  ::=  '('    b_Name   ')'
h_OptionalName  ::=
h_ProductionDclStmt  ::=  h_OptionalName   '|'    b_ProductionRHS   a_ProductionModifiers   b_ProductionBody   h_OptionalAction
h_ProductionDclStmts  ::=  h_ProductionDclStmt   h_ProductionDclStmts
h_ProductionDclStmts  ::=  h_ProductionDclStmt
h_QNameWithTL  ::=  b_QName   f_BracketedOptTypeExprs
h_QNames  ::=  h_QNameWithTL   ','    h_QNames
h_QNames  ::=  h_QNameWithTL
h_QNames2  ::=  h_QNameWithTL   ','    h_QNames2
h_QNames2  ::=  h_QNameWithTL   ','    h_QNameWithTL
k_ConvAspectLHS  ::=  b_Name   '::'    f_TypeExpr
k_ConvAspectLHS  ::=  f_TypeExpr
k_ConvenienceAspectEquationKind  ::=  'using'   '='
k_ConvenienceAspectEquationKind  ::=  'using'   ':='
k_ConvenienceAspectEquationKind  ::=  'using'   '<-'
k_ConvenienceAspectEquationKind  ::=
s_NameTick  ::=  s_IdTick_t
s_NameTickTick  ::=  s_IdTickTick_t
t_DoBinding  ::=  b_Name   '::'    f_TypeExpr   '<-'    b_Expr   ';'
t_DoBinding  ::=  b_Expr   ';'
t_DoBinding  ::=  'let'   b_Name   '::'    f_TypeExpr   '='    b_Expr   ';'
t_DoBody  ::=  t_DoBinding   t_DoBody
t_DoBody  ::=  b_Expr   ';'
t_DoBody  ::=  'return'   b_Expr   ';'
e_EasyTerminalRef  ::=  e_Terminal_t
l_MRuleList  ::=  l_MatchRule   '|'    l_MRuleList
l_MRuleList  ::=  l_MatchRule
l_MatchRule  ::=  l_PatternList   'when'   b_Expr   'matches'   l_Pattern   '->'    b_Expr
l_MatchRule  ::=  l_PatternList   'when'   b_Expr   '->'    b_Expr
l_MatchRule  ::=  l_PatternList   '->'    b_Expr
l_NamedPattern  ::=  b_QName   '='    l_Pattern
l_NamedPatternList  ::=  l_NamedPattern   ','    l_NamedPatternList
l_NamedPatternList  ::=  l_NamedPattern
l_Pattern  ::=  'AST'   '{'    r_AST_c   '}'
l_Pattern  ::=  l_Pattern   '::'    l_Pattern
l_Pattern  ::=  'false'
l_Pattern  ::=  b_Float_t
l_Pattern  ::=  b_Int_t
l_Pattern  ::=  '['    l_PatternList   ']'
l_Pattern  ::=  '('    l_Pattern   ')'
l_Pattern  ::=  b_QName   '('    l_PatternList   ')'
l_Pattern  ::=  b_QName   '('    l_PatternList   ','    l_NamedPatternList   ')'
l_Pattern  ::=  b_QName   '('    l_NamedPatternList   ')'
l_Pattern  ::=  b_String_t
l_Pattern  ::=  'true'
l_Pattern  ::=  b_Name
l_Pattern  ::=  '_'
l_Pattern  ::=  '$Pattern'   '{'    b_Expr   '}'
l_Pattern  ::=  '('    ')'
l_Pattern  ::=  '('    v_TuplePatternList   ')'
l_PatternList  ::=
l_PatternList  ::=  l_Pattern
l_PatternList  ::=  l_PatternList   ','    l_Pattern
n_StrategyExpr_c  ::=  '$StrategyExpr'   '{'    b_Expr   '}'
n_StrategyExpr_c  ::=  'printTerm'
n_StrategyExpr_c  ::=  'try'   '('    n_StrategyExpr_c   ')'
n_StrategyExpr_c  ::=  'repeat'   '('    n_StrategyExpr_c   ')'
n_StrategyExpr_c  ::=  'reduce'   '('    n_StrategyExpr_c   ')'
n_StrategyExpr_c  ::=  'bottomUp'   '('    n_StrategyExpr_c   ')'
n_StrategyExpr_c  ::=  'topDown'   '('    n_StrategyExpr_c   ')'
n_StrategyExpr_c  ::=  'downUp'   '('    n_StrategyExpr_c   ','    n_StrategyExpr_c   ')'
n_StrategyExpr_c  ::=  'allBottomUp'   '('    n_StrategyExpr_c   ')'
n_StrategyExpr_c  ::=  'allTopDown'   '('    n_StrategyExpr_c   ')'
n_StrategyExpr_c  ::=  'allDownUp'   '('    n_StrategyExpr_c   ','    n_StrategyExpr_c   ')'
n_StrategyExpr_c  ::=  'someBottomUp'   '('    n_StrategyExpr_c   ')'
n_StrategyExpr_c  ::=  'someTopDown'   '('    n_StrategyExpr_c   ')'
n_StrategyExpr_c  ::=  'someDownUp'   '('    n_StrategyExpr_c   ','    n_StrategyExpr_c   ')'
n_StrategyExpr_c  ::=  'onceBottomUp'   '('    n_StrategyExpr_c   ')'
n_StrategyExpr_c  ::=  'onceTopDown'   '('    n_StrategyExpr_c   ')'
n_StrategyExpr_c  ::=  'onceDownUp'   '('    n_StrategyExpr_c   ','    n_StrategyExpr_c   ')'
n_StrategyExpr_c  ::=  'innermost'   '('    n_StrategyExpr_c   ')'
n_StrategyExpr_c  ::=  'outermost'   '('    n_StrategyExpr_c   ')'
n_StrategyExpr_c  ::=  'id'
n_StrategyExpr_c  ::=  'fail'
n_StrategyExpr_c  ::=  n_StrategyExpr_c   '<*'    n_StrategyExpr_c
n_StrategyExpr_c  ::=  n_StrategyExpr_c   '<+'    n_StrategyExpr_c
n_StrategyExpr_c  ::=  'all'   '('    n_StrategyExpr_c   ')'
n_StrategyExpr_c  ::=  'some'   '('    n_StrategyExpr_c   ')'
n_StrategyExpr_c  ::=  'one'   '('    n_StrategyExpr_c   ')'
n_StrategyExpr_c  ::=  n_StrategyQName   '('    n_StrategyExprs_c   ')'
n_StrategyExpr_c  ::=  'rec'   b_Name   '->'    n_StrategyExpr_c
n_StrategyExpr_c  ::=  'rule'    'on'   b_Name   '::'    f_TypeExpr   'of'   l_Opt_Vbar_t   l_MRuleList   'end'
n_StrategyExpr_c  ::=  'rule'    'on'   f_TypeExpr   'of'   l_Opt_Vbar_t   l_MRuleList   'end'
n_StrategyExpr_c  ::=  n_StrategyQName
n_StrategyExpr_c  ::=  '('    n_StrategyExpr_c   ')'
n_StrategyExprs_c  ::=  n_StrategyExpr_c   ','    n_StrategyExprs_c
n_StrategyExprs_c  ::=  n_StrategyExpr_c
n_StrategyExprs_c  ::=
n_StrategyQName  ::=  '$strategyQName'   '{'    b_Expr   '}'
n_StrategyQName  ::=  n_StrategyName_t   ':'    n_StrategyQName
n_StrategyQName  ::=  n_StrategyName_t
u_NonWater  ::=  '${'   b_Expr   '}'
u_SingleLineTemplateString  ::=  u_SingleLineTemplateStringBody   '"'
u_SingleLineTemplateString  ::=  '"'
u_SingleLineTemplateStringBody  ::=  u_SingleLineTemplateStringBodyItem   u_SingleLineTemplateStringBody
u_SingleLineTemplateStringBody  ::=  u_SingleLineTemplateStringBodyItem
u_SingleLineTemplateStringBody  ::=  u_SingleLineWater
u_SingleLineTemplateStringBodyItem  ::=  u_NonWater
u_SingleLineTemplateStringBodyItem  ::=  u_SingleLineWater   u_NonWater
u_SingleLineWater  ::=  u_SingleLineWater   u_SingleLineWaterItem
u_SingleLineWater  ::=  u_SingleLineWaterItem
u_SingleLineWaterItem  ::=  u_SingleLineQuoteWater
u_SingleLineWaterItem  ::=  '\'
u_SingleLineWaterItem  ::=  '$$'
u_SingleLineWaterItem  ::=  '\n'
u_TemplateString  ::=  u_TemplateStringBody   '"""'
u_TemplateString  ::=  '"""'
u_TemplateStringBody  ::=  u_TemplateStringBodyItem   u_TemplateStringBody
u_TemplateStringBody  ::=  u_TemplateStringBodyItem
u_TemplateStringBody  ::=  u_Water
u_TemplateStringBodyItem  ::=  u_NonWater
u_TemplateStringBodyItem  ::=  u_Water   u_NonWater
u_Water  ::=  u_Water   u_WaterItem
u_Water  ::=  u_WaterItem
u_WaterItem  ::=  u_QuoteWater
u_WaterItem  ::=  '\'
u_WaterItem  ::=  '$$'
u_WaterItem  ::=  u_LiteralNewline
u_WaterItem  ::=  '"'
u_WaterItem  ::=  ' '
o_GeneratorComponent  ::=  b_ModuleName   ';'
o_GeneratorComponents  ::=  o_GeneratorComponent   o_GeneratorComponents
o_GeneratorComponents  ::=
v_ListOfTypeExprs  ::=  f_TypeExpr   ','    f_TypeExpr
v_ListOfTypeExprs  ::=  f_TypeExpr   ','    v_ListOfTypeExprs
v_TupleList  ::=  b_Expr   ','    b_Expr
v_TupleList  ::=  b_Expr   ','    v_TupleList
v_TuplePatternList  ::=  l_Pattern   ','    v_TuplePatternList
v_TuplePatternList  ::=  l_Pattern   ','    l_Pattern
i_NameOrBOperator  ::=  '+'
i_NameOrBOperator  ::=  '&&'
i_NameOrBOperator  ::=  '||'
i_NameOrBOperator  ::=  b_Expr
i_NameOrBOperator  ::=  '*'
i_NameOrBOperator  ::=  '++'
c_ActionCode_c  ::=  '{'    b_ProductionStmts   '}'
c_LexerClassList  ::=  b_QName   ','    c_LexerClassList
c_LexerClassList  ::=  b_QName
c_LexerClassModifier  ::=  'disambiguate'   c_ActionCode_c
c_LexerClassModifier  ::=  'dominates'   c_TermPrecs
c_LexerClassModifier  ::=  'extends'   c_LexerClasses
c_LexerClassModifier  ::=  'prefix'   'separator'   b_String_t
c_LexerClassModifier  ::=  'submits'   'to'   c_TermPrecs
c_LexerClassModifiers  ::=  c_LexerClassModifier
c_LexerClassModifiers  ::=  c_LexerClassModifier   ','    c_LexerClassModifiers
c_LexerClasses  ::=  '{'    c_LexerClassList   '}'
c_LexerClasses  ::=  b_QName
c_ParserComponent  ::=  'prefer'   b_QName   'over'   c_TermList   ';'
c_ParserComponent  ::=  b_ModuleName   c_ParserComponentModifiers   ';'
c_ParserComponent  ::=  'layout'   '{'    c_TermList   '}'   ';'
c_ParserComponent  ::=  'layout'   '{'    '}'   ';'
c_ParserComponentModifier  ::=  'prefix'   c_TerminalPrefixItems   'with'   c_TerminalPrefix
c_ParserComponentModifiers  ::=  c_ParserComponentModifier   c_ParserComponentModifiers
c_ParserComponentModifiers  ::=
c_ParserComponents  ::=  c_ParserComponent   c_ParserComponents
c_ParserComponents  ::=
c_TermList  ::=  b_QName   ','    c_TermList
c_TermList  ::=  b_QName
c_TermPrecList  ::=  b_QName   ','    c_TermPrecList
c_TermPrecList  ::=  b_QName
c_TermPrecs  ::=  '{'    c_TermPrecList   '}'
c_TermPrecs  ::=  b_QName
c_TerminalPrefix  ::=  b_QName
c_TerminalPrefix  ::=  a_RegExpr   a_TerminalModifiers
c_TerminalPrefix  ::=  a_RegExpr
c_TerminalPrefix  ::=  b_String_t
c_TerminalPrefixItem  ::=  e_EasyTerminalRef
c_TerminalPrefixItem  ::=  b_QName
c_TerminalPrefixItems  ::=
c_TerminalPrefixItems  ::=  c_TerminalPrefixItem   ','    c_TerminalPrefixItems
c_TerminalPrefixItems  ::=  c_TerminalPrefixItem
p_AspectDefaultProductionSignature  ::=  b_Name   '::'    f_TypeExpr   '::='
q_FFIDef  ::=  b_String_t   ':'    'return'   b_String_t   ';'
q_FFIDefs  ::=  q_FFIDef   q_FFIDefs
q_FFIDefs  ::=  q_FFIDef
w_AssignExpr  ::=  b_Name   '::'    f_TypeExpr   '='    b_Expr
w_LetAssigns  ::=  w_AssignExpr
w_LetAssigns  ::=  w_AssignExpr   ','    w_LetAssigns
x_PrimPattern  ::=  b_QName   '('    x_VarBinders   ')'    '->'    b_Expr
x_PrimPatterns  ::=  x_PrimPattern   '|'    x_PrimPatterns
x_PrimPatterns  ::=  x_PrimPattern
x_VarBinder  ::=  '_'
x_VarBinder  ::=  b_Name
x_VarBinders  ::=  x_VarBinder   ','    x_VarBinders
x_VarBinders  ::=
x_VarBinders  ::=  x_VarBinder
r_AST_c  ::=  '$'    '{'    b_Expr   '}'
r_AST_c  ::=  r_QName_t
r_AST_c  ::=  '_'
r_AST_c  ::=  'true'
r_AST_c  ::=  'false'
r_AST_c  ::=  r_QName_t   '('    r_ASTs_c   ','    r_NamedASTs_c   ')'
r_AST_c  ::=  r_QName_t   '('    r_ASTs_c   ')'
r_AST_c  ::=  r_QName_t   '('    r_NamedASTs_c   ')'
r_AST_c  ::=  r_QName_t   '('    ')'
r_AST_c  ::=  'terminal'    '('    r_QName_t   ','    r_String_t   ','    r_AST_c   ')'
r_AST_c  ::=  '['    r_ASTs_c   ']'
r_AST_c  ::=  '['    ']'
r_AST_c  ::=  r_String_t
r_AST_c  ::=  r_Int_t
r_AST_c  ::=  r_Float_t
r_ASTs_c  ::=  r_ASTs_c   ','    r_AST_c
r_ASTs_c  ::=  r_AST_c
r_NamedAST_c  ::=  r_QName_t   '='    r_AST_c
r_NamedASTs_c  ::=  r_NamedASTs_c   ','    r_NamedAST_c
r_NamedASTs_c  ::=  r_NamedAST_c
d_Regex  ::=  d_RegexSeq   '|'    d_Regex
d_Regex  ::=
d_Regex  ::=  d_RegexSeq
d_RegexChar  ::=  d_RegexChar_t
d_RegexChar  ::=  d_EscapedChar_t
d_RegexCharSet  ::=  d_RegexCharSetItem
d_RegexCharSet  ::=  d_RegexCharSet   d_RegexCharSetItem
d_RegexCharSetItem  ::=  d_RegexChar
d_RegexCharSetItem  ::=  d_RegexChar   '-'    d_RegexChar
d_RegexItem  ::=  d_RegexChar
d_RegexItem  ::=  '('    d_Regex   ')'
d_RegexItem  ::=  '['    d_RegexCharSet   ']'
d_RegexItem  ::=  '['    '^'   d_RegexCharSet   ']'
d_RegexItem  ::=  '.'
d_RegexRepetition  ::=  d_RegexItem   '*'
d_RegexRepetition  ::=  d_RegexItem
d_RegexRepetition  ::=  d_RegexItem   '?'
d_RegexRepetition  ::=  d_RegexItem   '+'
d_RegexSeq  ::=  d_RegexRepetition
d_RegexSeq  ::=  d_RegexSeq   d_RegexRepetition

@mingodad
Copy link
Author

I just update the silver EBNF shown above replacing long prefixes with one letter prefix for better readability .

@mingodad
Copy link
Author

mingodad commented Feb 10, 2023

And here is an EBNF manually converted from https://github.com/melt-umn/copper/blob/develop/doc/specs/CupSkinGrammar.xml .

Copy and paste the EBNF shown bellow on https://www.bottlecaps.de/rr/ui on the tab Edit Grammar the click on the tab View Diagram to see/download a navigable railroad diagram.

grammar_start_at ::= GrammarFile
	| notes_for_railroad
notes_for_railroad ::=
CFDecl  ::=  precedence_kwd   assoctypes_kwd   CommaOrSymSeq   semi_kwd
CFDecl  ::=  name_tok   goesto_kwd   RHSSeq   semi_kwd
CFDecl  ::=  start_kwd   with_kwd   name_tok   semi_kwd
CFDecl  ::=  non_kwd   terminal_kwd   TypeName   CommaSymSeq   semi_kwd
CFDecl  ::=  non_kwd   terminal_kwd   CommaSymSeq   semi_kwd
CFDecls  ::=  CFDecl   CFDecls
CFDecls  ::=  CFDecl
CodeBlockOpt  ::=
CodeBlockOpt  ::=  code_block_open_kwd   code_t   code_block_close_kwd
CommaOrSymSeq  ::=  name_tok   SymSeq
CommaOrSymSeq  ::=  name_tok   comma_kwd   CommaSymSeq
CommaSymSeq  ::=  name_tok   comma_kwd   CommaSymSeq
CommaSymSeq  ::=  name_tok
CommaSymSeqOpt  ::=
CommaSymSeqOpt  ::=  CommaSymSeq
DeclBlock  ::=  attribute_decl_kwd   TypeName   name_tok   semi_kwd
DeclBlock  ::=  aux_block_open_kwd   code_t   aux_block_close_kwd
DeclBlock  ::=  cf_block_open_kwd   CFDecls   cf_block_close_kwd
DeclBlock  ::=  init_block_open_kwd   code_t   init_block_close_kwd
DeclBlock  ::=  lex_block_open_kwd   LexDecls   lex_block_close_kwd
DeclBlocks  ::=  DeclBlock   DeclBlocks
DeclBlocks  ::=  DeclBlock
GrammarFile  ::=  code_t   barrier_kwd   ParserDecl   DeclBlocks
IgnoreOpt  ::=  ignore_kwd
IgnoreOpt  ::=
LabeledSymSeq  ::=
LabeledSymSeq  ::=  name_tok   colon   name_tok   LabeledSymSeq
LabeledSymSeq  ::=  name_tok   LabeledSymSeq
LexDecl  ::=  disambiguate_kwd   name_tok   colon_kwd   lparen   CommaSymSeq   rparen   code_block_open_kwd   code_t   code_block_close_kwd   semi_kwd
LexDecl  ::=  disambiguate_kwd   name_tok   colon_kwd   lparen   CommaSymSeq   rparen   goesto_kwd   name_tok   semi_kwd
LexDecl  ::=  class_kwd   CommaSymSeq   semi_kwd
LexDecl  ::=  IgnoreOpt   terminal_kwd   name_tok   SuperRegexRoot   PrecListsOpt   CodeBlockOpt   TerminalFlags   semi_kwd
LexDecl  ::=  IgnoreOpt   terminal_kwd   TypeName   name_tok   goesto_kwd   RegexRoot   PrecListsOpt   CodeBlockOpt   TerminalFlags   semi_kwd
LexDecls  ::=  LexDecl   LexDecls
LexDecls  ::=  LexDecl
ParserDecl  ::=  parser_decl_kwd   name_tok
PrecList  ::=  gt_kwd   lparen   CommaSymSeqOpt   rparen
PrecList  ::=  in_kwd   lparen   CommaSymSeqOpt   rparen
PrecList  ::=  lt_kwd   lparen   CommaSymSeqOpt   rparen
PrecLists  ::=  PrecList   comma_kwd   PrecLists
PrecLists  ::=  PrecList
PrecListsOpt  ::=
PrecListsOpt  ::=  PrecLists
QualifiedName  ::=  name_tok   wildcard   QualifiedName
QualifiedName  ::=  name_tok
RHS  ::=  LabeledSymSeq   CodeBlockOpt   RHSFlags
RHSFlags  ::=  layout_decl_kwd   lparen   CommaSymSeqOpt   rparen   RHSFlags
RHSFlags  ::=  prec_decl_kwd   name_tok   RHSFlags
RHSFlags  ::=
RHSSeq  ::=  RHS   bar   RHSSeq
RHSSeq  ::=  RHS
RegexRoot  ::=  slash_kwd   Regex_R   slash_kwd
RegexRoot  ::=  slash_kwd   slash_kwd
Regex_CHAR  ::=  character
Regex_CHAR  ::=  escaped
Regex_DR  ::=  Regex_UR   Regex_RR
Regex_DR  ::=  Regex_UR   plus   Regex_RR
Regex_DR  ::=  Regex_UR   question   Regex_RR
Regex_DR  ::=  Regex_UR   star   Regex_RR
Regex_G  ::=  Regex_UG   Regex_RG
Regex_R  ::=  Regex_DR
Regex_R  ::=  Regex_DR   bar   Regex_R
Regex_RG  ::=  Regex_G
Regex_RG  ::=
Regex_RR  ::=  Regex_DR
Regex_RR  ::=
Regex_UG  ::=  Regex_CHAR
Regex_UG  ::=  Regex_CHAR   dash   Regex_CHAR
Regex_UR  ::=  Regex_CHAR
Regex_UR  ::=  lbrack   Regex_G   rbrack
Regex_UR  ::=  lbrack   not   Regex_G   rbrack
Regex_UR  ::=  lparen   Regex_R   rparen
Regex_UR  ::=  lbrack   colon   termname   colon   rbrack
Regex_UR  ::=  wildcard
SuperRegexRoot  ::=  goesto_kwd   RegexRoot
SymSeq  ::=
SymSeq  ::=  name_tok   SymSeq
TerminalFlags  ::=  prefix_decl_kwd   name_tok   TerminalFlags
TerminalFlags  ::=
TypeName  ::=  QualifiedName
TypeName  ::=  QualifiedName   lt_kwd   TypeNameSeq   gt_kwd
TypeNameSeq  ::=  TypeName   comma_kwd   TypeNameSeq
TypeNameSeq  ::=  TypeName

barrier_kwd ::= '%%'
goesto_kwd ::= '::='
comma_kwd ::= ','
semi_kwd ::= ';'
slash_kwd ::= '/'
lt_kwd ::= '<'
gt_kwd ::= '>'
colon_kwd ::= ':'
attribute_decl_kwd ::= '%attr'
layout_decl_kwd ::= '%layout'
parser_decl_kwd ::= '%parser'
prec_decl_kwd ::= '%prec'
prefix_decl_kwd ::= '%prefix'
aux_block_open_kwd ::= '%aux{'
aux_block_close_kwd ::= '%aux}'
init_block_open_kwd ::= '%init{'
init_block_close_kwd ::= '%init}'
lex_block_open_kwd ::= '%lex{'
lex_block_close_kwd ::= '%lex}'
cf_block_open_kwd ::= '%cf{'
cf_block_close_kwd ::= '%cf}'
code_block_open_kwd ::= '{:'
code_block_close_kwd ::= ':}'
non_kwd ::= 'non'
ignore_kwd ::= 'ignore'
terminal_kwd ::= 'terminal'
class_kwd ::= 'class'
precedence_kwd ::= 'precedence'
disambiguate_kwd ::= 'disambiguate'
start_kwd ::= 'start'
with_kwd ::= 'with'
in_kwd ::= 'in'
assoctypes_kwd ::= 'left' | 'right' | 'nonassoc'
name_tok ::= [A-Za-z][0-9A-Za-z]*
prec_number ::= '0' | [1-9][0-9]*
plus ::= '+'
star ::= '*'
question ::= '?'
bar ::= '|'
dash ::= '-'
colon ::= ':'
not ::= '^'
lbrack ::= '['
rbrack ::= ']'
lparen ::= '('
rparen ::= ')'
lbrace ::= '{'
rbrace ::= '}'
wildcard ::= '.'
character ::= ''
termname ::= ''
escaped ::= '\'
code_t ::= '%:'
ws ::= '///***/\t-\n\t-\n'
ws_no_line ::= '/***/\t-\n\t-\n'

@mingodad
Copy link
Author

Here is the ableC-prolog extension EBNF.

Copy and paste the EBNF shown bellow on https://www.bottlecaps.de/rr/ui on the tab Edit Grammar the click on the tab View Diagram to see/download a navigable railroad diagram.

grammar_start_at ::= a_Root
	| notes_for_railroad
notes_for_railroad ::=
	| 'a_ prefix for edu:umn:cs:melt:ableC:concretesyntax:'
	| 'b_ prefix for edu:umn:cs:melt:ableC:concretesyntax:gcc_exts:'
	| 'c_ prefix for edu:umn:cs:melt:ableC:concretesyntax:c11:'
	| 'd_ prefix for edu:umn:cs:melt:exts:ableC:algebraicDataTypes:datatype:concretesyntax:'
	| 'e_ prefix for edu:umn:cs:melt:exts:ableC:prolog:core:concretesyntax:'
	| 'f_ prefix for edu:umn:cs:melt:exts:ableC:templateAlgebraicDataTypes:datatype:concretesyntax:'
	| 'g_ prefix for edu:umn:cs:melt:exts:ableC:templating:concretesyntax:templateParameters:'
	| 'h_ prefix for edu:umn:cs:melt:exts:ableC:templating:concretesyntax:templateFunctionDecl:'
	| 'i_ prefix for edu:umn:cs:melt:exts:ableC:templating:concretesyntax:templateStructDecl:'
	| 'j_ prefix for edu:umn:cs:melt:exts:ableC:string:concretesyntax:'
	| 'k_ prefix for edu:umn:cs:melt:exts:ableC:unification:concretesyntax:unification:'
	| 'l_ prefix for edu:umn:cs:melt:exts:ableC:algebraicDataTypes:patternmatching:concretesyntax:'
	| 'm_ prefix for edu:umn:cs:melt:exts:ableC:prolog:list:concretesyntax:'
	| 'n_ prefix for edu:umn:cs:melt:exts:ableC:templating:concretesyntax:instantiationExpr:'
	| 'o_ prefix for edu:umn:cs:melt:exts:ableC:templating:concretesyntax:templateArguments:'
	| 'p_ prefix for edu:umn:cs:melt:exts:ableC:vector:concretesyntax:'
	| 'q_ prefix for edu:umn:cs:melt:exts:ableC:closure:concretesyntax:typeExpr:'
	| 'r_ prefix for edu:umn:cs:melt:exts:ableC:templating:concretesyntax:instantiationTypeExpr:'
	| 's_ prefix for edu:umn:cs:melt:exts:ableC:templating:concretesyntax:maybeAttributes:'
a_AbstractDeclarator_c  ::=  a_Pointer_c   a_DirectAbstractDeclarator_c
a_AbstractDeclarator_c  ::=  a_DirectAbstractDeclarator_c
a_AbstractDeclarator_c  ::=  a_Pointer_c
a_AddMulLeftOp_c  ::=  'AddMulLeft_Never!!!nevernever1234567890'
a_AddMulLeft_c  ::=  a_AddMulRight_c
a_AddMulLeft_c  ::=  a_AddMulLeft_c   a_AddMulLeftOp_c   a_AddMulRight_c
a_AddMulNoneOp_c  ::=  'AddMulNone_Never!!!nevernever1234567890'
a_AddMulNone_c  ::=  a_MultiplicativeExpr_c
a_AddMulNone_c  ::=  a_MultiplicativeExpr_c   a_AddMulNoneOp_c   a_MultiplicativeExpr_c
a_AddMulRightOp_c  ::=  'AddMulRight_Never!!!nevernever1234567890'
a_AddMulRight_c  ::=  a_AddMulNone_c
a_AddMulRight_c  ::=  a_AddMulNone_c   a_AddMulRightOp_c   a_AddMulRight_c
a_AdditiveExpr_c  ::=  a_AddMulLeft_c
a_AdditiveExpr_c  ::=  a_AdditiveExpr_c   a_AdditiveOp_c   a_AddMulLeft_c
a_AdditiveOp_c  ::=  '+'
a_AdditiveOp_c  ::=  '-'
a_AndExpr_c  ::=  a_EqualityExpr_c
a_AndExpr_c  ::=  a_AndExpr_c   a_AndOp_c   a_EqualityExpr_c
a_AndOp_c  ::=  '&'
a_ArgumentExprList_c  ::=  a_AssignExpr_c
a_ArgumentExprList_c  ::=  a_ArgumentExprList_c   ','   a_AssignExpr_c
a_ArrayDesignator_c  ::=  '['    a_ConstantExpr_c   '...'   a_ConstantExpr_c   ']'
a_ArrayDesignator_c  ::=  '['    a_ConstantExpr_c   ']'
a_AssignExpr_c  ::=  a_ConditionalExpr_c
a_AssignExpr_c  ::=  a_UnaryExpr_c   a_AssignOp_c   a_AssignExpr_c
a_AssignOp_c  ::=  '='
a_AssignOp_c  ::=  '*='
a_AssignOp_c  ::=  '/='
a_AssignOp_c  ::=  '%='
a_AssignOp_c  ::=  '+='
a_AssignOp_c  ::=  '-='
a_AssignOp_c  ::=  '<<='
a_AssignOp_c  ::=  '>>='
a_AssignOp_c  ::=  '&='
a_AssignOp_c  ::=  '^='
a_AssignOp_c  ::=  '|='
a_BlockItemList_c  ::=  a_BlockItem_c
a_BlockItemList_c  ::=  a_BlockItemList_c   a_BlockItem_c
a_BlockItem_c  ::=  a_Stmt_c
a_BlockItem_c  ::=  '__extension__'   a_Declaration_c
a_BlockItem_c  ::=  b_NestedFunctionDefinition_c
a_BlockItem_c  ::=  a_Declaration_c
a_CastExpr_c  ::=  a_UnaryExpr_c
a_CastExpr_c  ::=  '('   a_TypeName_c   ')'   a_CastExpr_c
a_CompoundStatement_c  ::=  '{'    b_LabelDeclarations_c   a_BlockItemList_c   '}'
a_CompoundStatement_c  ::=  '{'    a_BlockItemList_c   '}'
a_CompoundStatement_c  ::=  '{'    '}'
a_ConditionalExpr_c  ::=  a_LogicalOrExpr_c   '?'    ':'   a_ConditionalExpr_c
a_ConditionalExpr_c  ::=  a_LogicalOrExpr_c   '?'    a_Expr_c   ':'   a_ConditionalExpr_c
a_ConditionalExpr_c  ::=  a_LogicalOrExpr_c
a_ConstantExpr_c  ::=  a_ConditionalExpr_c
a_Constant_c  ::=  b_IDecConstant_t
a_Constant_c  ::=  b_IDecConstantU_t
a_Constant_c  ::=  b_IDecConstantL_t
a_Constant_c  ::=  b_IDecConstantUL_t
a_Constant_c  ::=  b_IDecConstantLL_t
a_Constant_c  ::=  b_IDecConstantULL_t
a_Constant_c  ::=  b_IFloatConstant_t
a_Constant_c  ::=  b_IFloatConstantFloat_t
a_Constant_c  ::=  b_IFloatConstantLongDouble_t
a_Constant_c  ::=  b_IHexFloatConstant_t
a_Constant_c  ::=  b_IHexFloatConstantFloat_t
a_Constant_c  ::=  b_IHexFloatConstantLongDouble_t
a_Constant_c  ::=  a_DecConstant_t
a_Constant_c  ::=  a_DecConstantU_t
a_Constant_c  ::=  a_DecConstantL_t
a_Constant_c  ::=  a_DecConstantUL_t
a_Constant_c  ::=  a_DecConstantLL_t
a_Constant_c  ::=  a_DecConstantULL_t
a_Constant_c  ::=  a_OctConstant_t
a_Constant_c  ::=  a_OctConstantU_t
a_Constant_c  ::=  a_OctConstantL_t
a_Constant_c  ::=  a_OctConstantUL_t
a_Constant_c  ::=  a_OctConstantLL_t
a_Constant_c  ::=  a_OctConstantULL_t
a_Constant_c  ::=  a_OctConstantError_t
a_Constant_c  ::=  a_HexConstant_t
a_Constant_c  ::=  a_HexConstantU_t
a_Constant_c  ::=  a_HexConstantL_t
a_Constant_c  ::=  a_HexConstantUL_t
a_Constant_c  ::=  a_HexConstantLL_t
a_Constant_c  ::=  a_HexConstantULL_t
a_Constant_c  ::=  a_FloatConstant_t
a_Constant_c  ::=  a_FloatConstantFloat_t
a_Constant_c  ::=  a_FloatConstantLongDouble_t
a_Constant_c  ::=  a_HexFloatConstant_t
a_Constant_c  ::=  a_HexFloatConstantFloat_t
a_Constant_c  ::=  a_HexFloatConstantLongDouble_t
a_Constant_c  ::=  a_CharConstant_t
a_Constant_c  ::=  a_CharConstantL_t
a_Constant_c  ::=  a_CharConstantU_t
a_Constant_c  ::=  a_CharConstantUBig_t
a_DeclarationList_c  ::=
a_DeclarationList_c  ::=  a_Declaration_c   a_DeclarationList_c
a_DeclarationSpecifiers_c  ::=  c_AlignmentSpecifier_c   a_DeclarationSpecifiers_c
a_DeclarationSpecifiers_c  ::=  c_AlignmentSpecifier_c
a_DeclarationSpecifiers_c  ::=  b_Attributes_c   a_DeclarationSpecifiers_c
a_DeclarationSpecifiers_c  ::=  b_Attributes_c
a_DeclarationSpecifiers_c  ::=  a_TypeSpecifierItem_c
a_DeclarationSpecifiers_c  ::=  a_TypeQualifier_c   a_DeclarationSpecifiers_c
a_DeclarationSpecifiers_c  ::=  a_TypeQualifier_c
a_DeclarationSpecifiers_c  ::=  a_FunctionSpecifier_c   a_DeclarationSpecifiers_c
a_DeclarationSpecifiers_c  ::=  a_FunctionSpecifier_c
a_DeclarationSpecifiers_c  ::=  a_StorageClassSpecifier_c   a_DeclarationSpecifiers_c
a_DeclarationSpecifiers_c  ::=  a_StorageClassSpecifier_c
a_DeclarationSpecifiers_c  ::=  a_TypeSpecifierItem_c   a_DeclarationSpecifiers_c
a_Declaration_c  ::=  c_StaticAssertDeclaration_c
a_Declaration_c  ::=  a_DeclarationSpecifiers_c   a_InitDeclaratorList_c   ';'
a_Declaration_c  ::=  a_DeclarationSpecifiers_c   ';'
a_Declaration_c  ::=  'datatype'    b_Attributes_c   a_Identifier_c   '{'    d_ConstructorList_c   '}'
a_Declaration_c  ::=  'datatype'    a_Identifier_c   '{'    d_ConstructorList_c   '}'
a_Declaration_c  ::=  'prolog'   '{'    e_LogicStmts_c   '}'
a_Declaration_c  ::=  'template'   f_TemplateInitialDatatypeDeclaration_c   '{'    d_ConstructorList_c   '}'   ';'
a_Declaration_c  ::=  'template'   f_TemplateInitialDatatypeDeclaration_c   ';'
a_Declaration_c  ::=  'template'   '<'    g_TemplateParameters_c   '>'   h_TemplateInitialFunctionDefinition_c   a_CompoundStatement_c
a_Declaration_c  ::=  'template'   '<'    g_TemplateParameters_c   '>'   a_DeclarationSpecifiers_c   a_InitDeclaratorList_c   ';'
a_Declaration_c  ::=  'template'   i_TemplateInitialStructDeclaration_c   '{'    a_StructDeclarationList_c   '}'   ';'
a_Declaration_c  ::=  'template'   i_TemplateInitialStructDeclaration_c   ';'
a_Declaration_c  ::=  'using'   a_Identifier_c   '<'    g_TemplateParameters_c   '>'   '='   a_TypeName_c   ';'
a_Declaration_c  ::=  'var_reference'    'datatype'    a_Identifier_t   'with'    a_Identifier_c   ';'
a_Declaration_c  ::=  'var_reference'    'datatype'    a_Identifier_t   'with'    a_Identifier_t   'prefix'   a_Identifier_c   ';'
a_Declaration_c  ::=  'template'   'var_reference'    'datatype'    a_Identifier_t   'with'    a_Identifier_c   ';'
a_Declaration_c  ::=  'template'   'var_reference'    'datatype'    a_Identifier_t   'with'    a_Identifier_t   'prefix'   a_Identifier_c   ';'
a_Declarator_c  ::=  a_Pointer_c   a_DirectDeclarator_c
a_Declarator_c  ::=  a_DirectDeclarator_c
a_Designation_c  ::=  a_ArrayDesignator_c
a_Designation_c  ::=  a_Identifier_c   ':'
a_Designation_c  ::=  a_DesignatorList_c   '='
a_DesignatorList_c  ::=  a_DesignatorList_c   a_Designator_c
a_DesignatorList_c  ::=  a_Designator_c
a_Designator_c  ::=  a_ArrayDesignator_c
a_Designator_c  ::=  '.'   a_Identifier_c
a_DirectAbstractDeclarator_c  ::=  '('   a_AbstractDeclarator_c   ')'
a_DirectAbstractDeclarator_c  ::=  a_PostfixModifier_c
a_DirectAbstractDeclarator_c  ::=  a_DirectAbstractDeclarator_c   a_PostfixModifier_c
a_DirectDeclarator_c  ::=  '('   a_Declarator_c   ')'
a_DirectDeclarator_c  ::=  a_DirectDeclarator_c   '('   a_IdentifierList_c   ')'   a_OptTypeQualifierList_c
a_DirectDeclarator_c  ::=  a_Identifier_c
a_DirectDeclarator_c  ::=  a_DirectDeclarator_c   a_PostfixModifier_c
a_EnumSpecifier_c  ::=  'enum'   '{'    a_EnumeratorList_c   '}'
a_EnumSpecifier_c  ::=  'enum'   a_Identifier_c   '{'    a_EnumeratorList_c   '}'
a_EnumSpecifier_c  ::=  'enum'   '{'    a_EnumeratorList_c   ','   '}'
a_EnumSpecifier_c  ::=  'enum'   a_Identifier_c   '{'    a_EnumeratorList_c   ','   '}'
a_EnumSpecifier_c  ::=  'enum'   a_Identifier_c
a_EnumeratorList_c  ::=  a_Enumerator_c
a_EnumeratorList_c  ::=  a_EnumeratorList_c   ','   a_Enumerator_c
a_Enumerator_c  ::=  a_Identifier_c
a_Enumerator_c  ::=  a_Identifier_c   '='   a_ConstantExpr_c
a_EqualityExpr_c  ::=  a_RelationalExpr_c
a_EqualityExpr_c  ::=  a_EqualityExpr_c   a_EqualityOp_c   a_RelationalExpr_c
a_EqualityOp_c  ::=  '=='
a_EqualityOp_c  ::=  '!='
a_ExclusiveOrExpr_c  ::=  a_AndExpr_c
a_ExclusiveOrExpr_c  ::=  a_ExclusiveOrExpr_c   a_ExclusiveOrOp_c   a_AndExpr_c
a_ExclusiveOrOp_c  ::=  '^'
a_ExprStmt_c  ::=  ';'
a_ExprStmt_c  ::=  a_Expr_c   ';'
a_Expr_c  ::=  'TypeNames_NEVER_t!!!nevernever1234567890'   a_TypeNames_c   ')'
a_Expr_c  ::=  'TypeNames_NEVER_t!!!nevernever1234567890'   a_TypeNames_c   '{'
a_Expr_c  ::=  'TypeNames_NEVER_t!!!nevernever1234567890'   a_TypeNames_c   '}'
a_Expr_c  ::=  'TypeNames_NEVER_t!!!nevernever1234567890'   a_TypeNames_c   '>'
a_Expr_c  ::=  'TypeNames_NEVER_t!!!nevernever1234567890'   a_TypeNames_c   ';'
a_Expr_c  ::=  'TypeNames_NEVER_t!!!nevernever1234567890'   a_TypeNames_c   a_AllowSEUDecl_t
a_Expr_c  ::=  'Names_NEVER_t!!!nevernever1234567890'   a_Names_c   ')'
a_Expr_c  ::=  'Names_NEVER_t!!!nevernever1234567890'   a_Names_c   '}'
a_Expr_c  ::=  'Names_NEVER_t!!!nevernever1234567890'   a_Names_c   '>'
a_Expr_c  ::=  'Names_NEVER_t!!!nevernever1234567890'   a_Names_c   ';'
a_Expr_c  ::=  'Declarator_NEVER_t!!!nevernever1234567890'   a_Declarator_c   '>'
a_Expr_c  ::=  'DirectDeclarator_NEVER_t!!!nevernever1234567890'   a_DirectDeclarator_c   '>'
a_Expr_c  ::=  a_AssignExpr_c   ','   a_Expr_c
a_Expr_c  ::=  'Expr_NEVER_t!!!nevernever1234567890'   a_Expr_c   a_AllowSEUDecl_t
a_Expr_c  ::=  a_AssignExpr_c
a_Expr_c  ::=  'TypeIdName_Never!!!nevernever1234567890'   a_TypeIdName_c   '<'
a_ExternalDeclaration_c  ::=  '__extension__'   a_ExternalDeclaration_c
a_ExternalDeclaration_c  ::=  b_SimpleAsmStatement_c
a_ExternalDeclaration_c  ::=  '#'   'pragma'   b_Pack_t
a_ExternalDeclaration_c  ::=  '#'   'pragma'   'redefine_extname'   a_Identifier_c   a_Identifier_c
a_ExternalDeclaration_c  ::=  '#'   'pragma'   b_GCC_t
a_ExternalDeclaration_c  ::=  a_Declaration_c
a_ExternalDeclaration_c  ::=  a_FunctionDefinition_c
a_ExternalDeclaration_c  ::=  'show'   '('   a_TypeName_c   ')'   'with'    a_Identifier_t
a_ExternalDeclaration_c  ::=  'show'   a_TypeName_t   'with'    a_Identifier_t
a_ExternalDeclaration_c  ::=  'show'   j_TagKeyword_c   a_TypeName_t   'with'    a_Identifier_t
a_ExternalDeclaration_c  ::=  'unify'   '('   a_TypeName_c   ')'   'with'    a_Identifier_t
a_ExternalDeclaration_c  ::=  'unify'   a_TypeName_t   'with'    a_Identifier_t
a_ExternalDeclaration_c  ::=  'unify'   j_TagKeyword_c   a_TypeName_t   'with'    a_Identifier_t
a_FunctionDefinition_c  ::=  a_InitialFunctionDefinition_c   a_CompoundStatement_c
a_FunctionSpecifier_c  ::=  '_Noreturn'
a_FunctionSpecifier_c  ::=  '__inline__'
a_FunctionSpecifier_c  ::=  '__inline'
a_FunctionSpecifier_c  ::=  'inline'
a_IdentifierList_c  ::=  a_Identifier_c
a_IdentifierList_c  ::=  a_IdentifierList_c   ','   a_Identifier_c
a_Identifier_c  ::=  a_Identifier_t
a_InclusiveOrExpr_c  ::=  a_ExclusiveOrExpr_c
a_InclusiveOrExpr_c  ::=  a_InclusiveOrExpr_c   a_InclusiveOrOp_c   a_ExclusiveOrExpr_c
a_InclusiveOrOp_c  ::=  '|'
a_InitDeclaratorList_c  ::=  a_InitDeclarator_c
a_InitDeclaratorList_c  ::=  a_InitDeclaratorList_c   ','   a_InitDeclarator_c
a_InitDeclarator_c  ::=  a_Declarator_c   b_Attributes_c
a_InitDeclarator_c  ::=  a_Declarator_c   b_Attributes_c   '='   a_Initializer_c
a_InitDeclarator_c  ::=  a_Declarator_c   b_SimpleAsmStatement_c
a_InitDeclarator_c  ::=  a_Declarator_c   b_SimpleAsmStatement_c   b_Attributes_c
a_InitDeclarator_c  ::=  a_Declarator_c
a_InitDeclarator_c  ::=  a_Declarator_c   '='   a_Initializer_c
a_InitialFunctionDefinition_c  ::=  a_DeclarationSpecifiers_c   a_Declarator_c   a_InitiallyUnqualifiedDeclarationList_c
a_InitialFunctionDefinition_c  ::=  a_Declarator_c   a_InitiallyUnqualifiedDeclarationList_c
a_InitializerList_c  ::=  a_Initializer_c
a_InitializerList_c  ::=  a_Designation_c   a_Initializer_c
a_InitializerList_c  ::=  a_InitializerList_c   ','   a_Initializer_c
a_InitializerList_c  ::=  a_InitializerList_c   ','   a_Designation_c   a_Initializer_c
a_Initializer_c  ::=  '{'    '}'
a_Initializer_c  ::=  a_AssignExpr_c
a_Initializer_c  ::=  '{'    a_InitializerList_c   '}'
a_Initializer_c  ::=  '{'    a_InitializerList_c   ','   '}'
a_InitiallyUnqualifiedDeclarationList_c  ::=
a_InitiallyUnqualifiedDeclarationList_c  ::=  a_InitiallyUnqualifiedDeclaration_c   a_DeclarationList_c
a_InitiallyUnqualifiedDeclarationSpecifiers_c  ::=  a_StorageClassSpecifier_c   a_DeclarationSpecifiers_c
a_InitiallyUnqualifiedDeclarationSpecifiers_c  ::=  a_StorageClassSpecifier_c
a_InitiallyUnqualifiedDeclarationSpecifiers_c  ::=  a_TypeSpecifierItem_c   a_DeclarationSpecifiers_c
a_InitiallyUnqualifiedDeclarationSpecifiers_c  ::=  a_TypeSpecifierItem_c
a_InitiallyUnqualifiedDeclarationSpecifiers_c  ::=  a_FunctionSpecifier_c   a_DeclarationSpecifiers_c
a_InitiallyUnqualifiedDeclarationSpecifiers_c  ::=  a_FunctionSpecifier_c
a_InitiallyUnqualifiedDeclaration_c  ::=  a_InitiallyUnqualifiedDeclarationSpecifiers_c   a_InitDeclaratorList_c   ';'
a_InitiallyUnqualifiedDeclaration_c  ::=  a_InitiallyUnqualifiedDeclarationSpecifiers_c   ';'
a_IterationStmt_c  ::=  'for'   '('   a_ExprStmt_c   a_ExprStmt_c   ')'   a_Stmt_c
a_IterationStmt_c  ::=  'for'   '('   a_Declaration_c   a_ExprStmt_c   a_Expr_c   ')'   a_Stmt_c
a_IterationStmt_c  ::=  'for'   '('   a_Declaration_c   a_ExprStmt_c   ')'   a_Stmt_c
a_IterationStmt_c  ::=  'while'   '('   a_Expr_c   ')'   a_Stmt_c
a_IterationStmt_c  ::=  'do'   a_Stmt_c   'while'   '('   a_Expr_c   ')'   ';'
a_IterationStmt_c  ::=  'for'   '('   a_ExprStmt_c   a_ExprStmt_c   a_Expr_c   ')'   a_Stmt_c
a_JumpStmt_c  ::=  'goto'   '*'   a_Expr_c   ';'
a_JumpStmt_c  ::=  b_Asm_Starter_c   'goto'   '('   a_StringConstant_c   ':'   ':'   ':'   ':'   a_IdentifierList_c   ')'
a_JumpStmt_c  ::=  'goto'   a_Identifier_c   ';'
a_JumpStmt_c  ::=  'continue'   ';'
a_JumpStmt_c  ::=  'break'   ';'
a_JumpStmt_c  ::=  'return'   ';'
a_JumpStmt_c  ::=  'return'   a_Expr_c   ';'
a_LabeledStmt_c  ::=  a_Identifier_c   ':'   b_Attributes_c   a_Stmt_c
a_LabeledStmt_c  ::=  'case'   a_ConstantExpr_c   '...'   a_ConstantExpr_c   ':'   a_Stmt_c
a_LabeledStmt_c  ::=  a_Identifier_c   ':'   a_Stmt_c
a_LabeledStmt_c  ::=  'case'   a_ConstantExpr_c   ':'   a_Stmt_c
a_LabeledStmt_c  ::=  'default'   ':'   a_Stmt_c
a_LogicalAndExpr_c  ::=  a_InclusiveOrExpr_c
a_LogicalAndExpr_c  ::=  a_LogicalAndExpr_c   a_LogicalAndOp_c   a_InclusiveOrExpr_c
a_LogicalAndOp_c  ::=  '&&'
a_LogicalOrExpr_c  ::=  a_LogicalAndExpr_c
a_LogicalOrExpr_c  ::=  a_LogicalOrExpr_c   a_LogicalOrOp_c   a_LogicalAndExpr_c
a_LogicalOrOp_c  ::=  '||'
a_MultiplicativeExpr_c  ::=  a_CastExpr_c
a_MultiplicativeExpr_c  ::=  a_MultiplicativeExpr_c   a_MultiplicativeOp_c   a_CastExpr_c
a_MultiplicativeOp_c  ::=  '*'
a_MultiplicativeOp_c  ::=  '/'
a_MultiplicativeOp_c  ::=  '%'
a_Names_c  ::=  a_Identifier_c   ','   a_Names_c
a_Names_c  ::=  a_Identifier_c
a_Names_c  ::=
a_OptTypeQualifierList_c  ::=
a_OptTypeQualifierList_c  ::=  a_TypeQualifierList_c
a_ParameterDeclaration_c  ::=  a_DeclarationSpecifiers_c   a_Declarator_c   b_Attributes_c
a_ParameterDeclaration_c  ::=  a_DeclarationSpecifiers_c   a_AbstractDeclarator_c   b_Attributes_c
a_ParameterDeclaration_c  ::=  a_DeclarationSpecifiers_c   a_Declarator_c
a_ParameterDeclaration_c  ::=  a_DeclarationSpecifiers_c   a_AbstractDeclarator_c
a_ParameterDeclaration_c  ::=  a_DeclarationSpecifiers_c
a_ParameterList_c  ::=  a_ParameterDeclaration_c
a_ParameterList_c  ::=  a_ParameterList_c   ','   a_ParameterDeclaration_c
a_ParameterTypeList_c  ::=  a_ParameterList_c
a_ParameterTypeList_c  ::=  a_ParameterList_c   ','   '...'
a_Pointer_c  ::=  '*'
a_Pointer_c  ::=  '*'   a_TypeQualifierList_c
a_Pointer_c  ::=  '*'   a_Pointer_c
a_Pointer_c  ::=  '*'   a_TypeQualifierList_c   a_Pointer_c
a_Pointer_c  ::=  '?'    a_Pointer_c
a_Pointer_c  ::=  '?'    k_InitiallyUnattributedTypeQualifierList_c   a_Pointer_c
a_Pointer_c  ::=  '?'
a_Pointer_c  ::=  '?'    k_InitiallyUnattributedTypeQualifierList_c
a_PostfixExpr_c  ::=  '('   a_TypeName_c   ')'   '{'    '}'
a_PostfixExpr_c  ::=  a_PrimaryExpr_c
a_PostfixExpr_c  ::=  a_PostfixExpr_c   '['    a_Expr_c   ']'
a_PostfixExpr_c  ::=  a_PostfixExpr_c   '('   a_ArgumentExprList_c   ')'
a_PostfixExpr_c  ::=  a_PostfixExpr_c   '('   a_ArgumentExprList_c   ','   ')'
a_PostfixExpr_c  ::=  a_PostfixExpr_c   '('   ')'
a_PostfixExpr_c  ::=  a_PostfixExpr_c   a_PostfixOp_c
a_PostfixExpr_c  ::=  '('   a_TypeName_c   ')'   '{'    a_InitializerList_c   '}'
a_PostfixExpr_c  ::=  '('   a_TypeName_c   ')'   '{'    a_InitializerList_c   ','   '}'
a_PostfixModifier_c  ::=  '['    ']'
a_PostfixModifier_c  ::=  '['    a_TypeQualifierList_c   a_AssignExpr_c   ']'
a_PostfixModifier_c  ::=  '['    a_AssignExpr_c   ']'
a_PostfixModifier_c  ::=  '['    a_TypeQualifierList_c   ']'
a_PostfixModifier_c  ::=  '['    'static'   a_TypeQualifierList_c   a_AssignExpr_c   ']'
a_PostfixModifier_c  ::=  '['    'static'   a_AssignExpr_c   ']'
a_PostfixModifier_c  ::=  '['    a_TypeQualifierList_c   'static'   a_AssignExpr_c   ']'
a_PostfixModifier_c  ::=  '['    a_TypeQualifierList_c   '*'   ']'
a_PostfixModifier_c  ::=  '['    '*'   ']'
a_PostfixModifier_c  ::=  '('   a_ParameterTypeList_c   ')'   a_OptTypeQualifierList_c
a_PostfixModifier_c  ::=  '('   ')'   a_OptTypeQualifierList_c
a_PostfixOp_c  ::=  '.'   a_Identifier_c
a_PostfixOp_c  ::=  '->'   a_Identifier_c
a_PostfixOp_c  ::=  '++'
a_PostfixOp_c  ::=  '--'
a_PrimaryExpr_c  ::=  c_GenericSelection_c
a_PrimaryExpr_c  ::=  '('   '{'    a_BlockItemList_c   '}'   ')'
a_PrimaryExpr_c  ::=  '__builtin_va_arg'   '('   a_AssignExpr_c   ','   a_TypeName_c   ')'
a_PrimaryExpr_c  ::=  '__builtin_offsetof'   '('   a_TypeName_c   ','   b_MemberDesignator_c   ')'
a_PrimaryExpr_c  ::=  '__builtin_types_compatible_p'   '('   a_TypeName_c   ','   a_TypeName_c   ')'
a_PrimaryExpr_c  ::=  '__builtin_constant_p'   '('   a_AssignExpr_c   ')'
a_PrimaryExpr_c  ::=  '__builtin_va_arg_pack'   '('   ')'
a_PrimaryExpr_c  ::=  '__builtin_expect'   '('   a_AssignExpr_c   ','   a_ConstantExpr_c   ')'
a_PrimaryExpr_c  ::=  '__builtin_va_start'   '('   a_Identifier_c   ','   a_Identifier_c   ')'
a_PrimaryExpr_c  ::=  '__builtin_va_end'   '('   a_Identifier_c   ')'
a_PrimaryExpr_c  ::=  a_Identifier_c
a_PrimaryExpr_c  ::=  a_Constant_c
a_PrimaryExpr_c  ::=  a_StringConstant_c
a_PrimaryExpr_c  ::=  '('   a_Expr_c   ')'
a_PrimaryExpr_c  ::=  'match'   '('   a_ArgumentExprList_c   ')'   '('   l_ExprClauses_c   ')'
a_PrimaryExpr_c  ::=  'new'   a_SpecifierQualifierList_c   '('   ')'
a_PrimaryExpr_c  ::=  'new'   a_SpecifierQualifierList_c   '('   a_ArgumentExprList_c   ')'
a_PrimaryExpr_c  ::=  'query'   e_Body_c   '{'    a_BlockItemList_c   '}'
a_PrimaryExpr_c  ::=  'query'   e_Body_c   '{'    '}'
a_PrimaryExpr_c  ::=  'term'   '<'    a_TypeName_c   '>'   '('   a_AssignExpr_c   ')'   '{'    e_LogicExpr_c   '}'
a_PrimaryExpr_c  ::=  'term'   '('   a_AssignExpr_c   ')'   '{'    e_LogicExpr_c   '}'
a_PrimaryExpr_c  ::=  'newlist'   '<'    a_TypeName_c   '>'   '('   a_Expr_c   ')'   '['    m_ListInitializerList_c   ']'
a_PrimaryExpr_c  ::=  'newlist'   '('   a_Expr_c   ')'   '['    m_ListInitializerList_c   ']'
a_PrimaryExpr_c  ::=  n_TemplateIdentifier_t   '<'    o_TemplateArguments_c   '>'   '('   a_ArgumentExprList_c   ')'
a_PrimaryExpr_c  ::=  n_TemplateIdentifier_t   '<'    o_TemplateArguments_c   '>'   '('   ')'
a_PrimaryExpr_c  ::=  n_TemplateIdentifier_t   '('   a_ArgumentExprList_c   ')'
a_PrimaryExpr_c  ::=  n_TemplateIdentifier_t   '('   ')'
a_PrimaryExpr_c  ::=  'inst'   a_Identifier_c   '<'    o_TemplateArguments_c   '>'   '('   a_ArgumentExprList_c   ')'
a_PrimaryExpr_c  ::=  'inst'   a_Identifier_c   '<'    o_TemplateArguments_c   '>'   '('   ')'
a_PrimaryExpr_c  ::=  'freevar'    '<'    a_TypeName_c   '>'   '('   a_AssignExpr_c   ')'
a_PrimaryExpr_c  ::=  'boundvar'   '('   a_AssignExpr_c   ','   a_AssignExpr_c   ')'
a_PrimaryExpr_c  ::=  'vec'   '<'    a_TypeName_c   '>'   '['    p_VectorConstructorExprList_c   ']'
a_PrimaryExpr_c  ::=  'vec'   '<'    a_TypeName_c   '>'   '['    ']'
a_PrimaryExpr_c  ::=  'vec'   '('   a_ArgumentExprList_c   ')'   '['    p_VectorConstructorExprList_c   ']'
a_PrimaryExpr_c  ::=  'vec'   '('   a_ArgumentExprList_c   ')'   '['    ']'
a_PrimaryExpr_c  ::=  'vec'   '['    p_VectorConstructorExprList_c   ']'
a_PrimaryExpr_c  ::=  'vec'   '['    ']'
a_PrimaryExpr_c  ::=  'vec'   '<'    a_TypeName_c   '>'   '('   a_ArgumentExprList_c   ')'   '['    p_VectorConstructorExprList_c   ']'
a_PrimaryExpr_c  ::=  'vec'   '<'    a_TypeName_c   '>'   '('   a_ArgumentExprList_c   ')'   '['    ']'
a_RelationalExpr_c  ::=  a_ShiftExpr_c
a_RelationalExpr_c  ::=  a_RelationalExpr_c   a_RelationalOp_c   a_ShiftExpr_c
a_RelationalOp_c  ::=  '<'
a_RelationalOp_c  ::=  '>'
a_RelationalOp_c  ::=  '<='
a_RelationalOp_c  ::=  '>='
a_Root  ::=  a_TranslationUnit_c
a_Root  ::=
a_SelectionStmt_c  ::=  'if'   '('   a_Expr_c   ')'   a_Stmt_c
a_SelectionStmt_c  ::=  'if'   '('   a_Expr_c   ')'   a_Stmt_c   'else'   a_Stmt_c
a_SelectionStmt_c  ::=  'switch'   '('   a_Expr_c   ')'   a_Stmt_c
a_SelectionStmt_c  ::=  'match'   '('   a_ArgumentExprList_c   ')'   '{'    l_StmtClauses_c   '}'
a_ShiftExpr_c  ::=  a_AdditiveExpr_c
a_ShiftExpr_c  ::=  a_ShiftExpr_c   a_ShiftOp_c   a_AdditiveExpr_c
a_ShiftOp_c  ::=  '<<'
a_ShiftOp_c  ::=  '>>'
a_SpecifierQualifierList_c  ::=  b_Attributes_c   a_SpecifierQualifierList_c
a_SpecifierQualifierList_c  ::=  b_Attributes_c
a_SpecifierQualifierList_c  ::=  a_TypeSpecifierItem_c   a_SpecifierQualifierList_c
a_SpecifierQualifierList_c  ::=  a_TypeSpecifierItem_c
a_SpecifierQualifierList_c  ::=  a_TypeQualifier_c   a_SpecifierQualifierList_c
a_SpecifierQualifierList_c  ::=  a_TypeQualifier_c
a_Stmt_c  ::=  a_ExprStmt_c
a_Stmt_c  ::=  '#'   'pragma'   b_OMP_t
a_Stmt_c  ::=  '#'   'pragma'   b_OMPFor_t
a_Stmt_c  ::=  b_Asm_Statement_c
a_Stmt_c  ::=  a_LabeledStmt_c
a_Stmt_c  ::=  a_CompoundStatement_c
a_Stmt_c  ::=  a_SelectionStmt_c
a_Stmt_c  ::=  a_IterationStmt_c
a_Stmt_c  ::=  a_JumpStmt_c
a_Stmt_c  ::=  'delete'   a_Expr_c   ';'
a_StorageClassSpecifier_c  ::=  '_Thread_local'
a_StorageClassSpecifier_c  ::=  '__thread'
a_StorageClassSpecifier_c  ::=  'typedef'
a_StorageClassSpecifier_c  ::=  'extern'
a_StorageClassSpecifier_c  ::=  'static'
a_StorageClassSpecifier_c  ::=  'auto'
a_StorageClassSpecifier_c  ::=  'register'
a_StringConstant_c  ::=  a_StringLiteral_c
a_StringConstant_c  ::=  a_StringLiteral_c   a_StringConstant_c
a_StringLiteral_c  ::=  a_StringConstant_t
a_StringLiteral_c  ::=  a_StringConstantU8_t
a_StringLiteral_c  ::=  a_StringConstantL_t
a_StringLiteral_c  ::=  a_StringConstantU_t
a_StringLiteral_c  ::=  a_StringConstantUBig_t
a_StructDeclarationList_c  ::=  a_StructDeclaration_c
a_StructDeclarationList_c  ::=  a_StructDeclarationList_c   a_StructDeclaration_c
a_StructDeclaration_c  ::=  a_StructOrUnion_c   a_Identifier_c   '{'    a_StructDeclarationList_c   '}'   ';'
a_StructDeclaration_c  ::=  a_StructOrUnion_c   '{'    a_StructDeclarationList_c   '}'   ';'
a_StructDeclaration_c  ::=  a_StructOrUnion_c   b_Attributes_c   a_Identifier_c   '{'    a_StructDeclarationList_c   '}'   ';'
a_StructDeclaration_c  ::=  a_StructOrUnion_c   b_Attributes_c   '{'    a_StructDeclarationList_c   '}'   ';'
a_StructDeclaration_c  ::=  a_StructOrUnion_c   a_Identifier_c   '{'    a_StructDeclarationList_c   '}'   b_Attributes_c   ';'
a_StructDeclaration_c  ::=  a_StructOrUnion_c   '{'    a_StructDeclarationList_c   '}'   b_Attributes_c   ';'
a_StructDeclaration_c  ::=  '__extension__'   a_StructDeclaration_c
a_StructDeclaration_c  ::=  a_SpecifierQualifierList_c   a_StructDeclaratorList_c   ';'
a_StructDeclaratorList_c  ::=  a_StructDeclarator_c
a_StructDeclaratorList_c  ::=  a_StructDeclaratorList_c   ','   a_StructDeclarator_c
a_StructDeclarator_c  ::=  a_Declarator_c   b_Attributes_c
a_StructDeclarator_c  ::=  a_Declarator_c   ':'   a_ConstantExpr_c   b_Attributes_c
a_StructDeclarator_c  ::=  ':'   a_ConstantExpr_c   b_Attributes_c
a_StructDeclarator_c  ::=  a_Declarator_c
a_StructDeclarator_c  ::=  a_Declarator_c   ':'   a_ConstantExpr_c
a_StructDeclarator_c  ::=  ':'   a_ConstantExpr_c
a_StructOrUnionSpecifier_c  ::=  a_StructOrUnion_c   a_Identifier_c   '{'    '}'
a_StructOrUnionSpecifier_c  ::=  a_StructOrUnion_c   '{'    '}'
a_StructOrUnionSpecifier_c  ::=  a_StructOrUnion_c   b_Attributes_c   a_Identifier_c   '{'    a_StructDeclarationList_c   '}'
a_StructOrUnionSpecifier_c  ::=  a_StructOrUnion_c   a_Identifier_c   '{'    a_StructDeclarationList_c   '}'   b_Attributes_c
a_StructOrUnionSpecifier_c  ::=  a_StructOrUnion_c   b_Attributes_c   a_Identifier_c   '{'    '}'
a_StructOrUnionSpecifier_c  ::=  a_StructOrUnion_c   a_Identifier_c   '{'    '}'   b_Attributes_c
a_StructOrUnionSpecifier_c  ::=  a_StructOrUnion_c   b_Attributes_c   '{'    '}'
a_StructOrUnionSpecifier_c  ::=  a_StructOrUnion_c   '{'    '}'   b_Attributes_c
a_StructOrUnionSpecifier_c  ::=  a_StructOrUnion_c   a_Identifier_c   '{'    a_StructDeclarationList_c   '}'
a_StructOrUnionSpecifier_c  ::=  a_StructOrUnion_c   '{'    a_StructDeclarationList_c   '}'
a_StructOrUnionSpecifier_c  ::=  a_StructOrUnion_c   a_Identifier_c
a_StructOrUnionSpecifier_c  ::=  'datatype'    a_Identifier_c
a_StructOrUnion_c  ::=  'struct'
a_StructOrUnion_c  ::=  'union'
a_TranslationUnit_c  ::=  a_TranslationUnit_c   ';'
a_TranslationUnit_c  ::=  a_ExternalDeclaration_c
a_TranslationUnit_c  ::=  a_TranslationUnit_c   a_ExternalDeclaration_c
a_TypeIdName_c  ::=  a_TypeName_t
a_TypeName_c  ::=  a_SpecifierQualifierList_c
a_TypeName_c  ::=  a_SpecifierQualifierList_c   a_AbstractDeclarator_c
a_TypeNames_c  ::=  a_TypeName_c   ','   a_TypeNames_c
a_TypeNames_c  ::=  a_TypeName_c
a_TypeNames_c  ::=
a_TypeQualifierList_c  ::=  b_Attributes_c   a_TypeQualifierList_c
a_TypeQualifierList_c  ::=  b_Attributes_c
a_TypeQualifierList_c  ::=  a_TypeQualifier_c
a_TypeQualifierList_c  ::=  a_TypeQualifier_c   a_TypeQualifierList_c
a_TypeQualifier_c  ::=  '_Atomic'
a_TypeQualifier_c  ::=  '__const'
a_TypeQualifier_c  ::=  '__restrict'
a_TypeQualifier_c  ::=  '__restrict__'
a_TypeQualifier_c  ::=  '__volatile__'
a_TypeQualifier_c  ::=  '__volatile'
a_TypeQualifier_c  ::=  'const'
a_TypeQualifier_c  ::=  'volatile'
a_TypeQualifier_c  ::=  'restrict'
a_TypeSpecifierItem_c  ::=  a_TypeSpecifier_c
a_TypeSpecifier_c  ::=  c_C11_Atomic_Specifier_t   a_TypeName_c   ')'
a_TypeSpecifier_c  ::=  '__builtin_va_list'
a_TypeSpecifier_c  ::=  '__signed__'
a_TypeSpecifier_c  ::=  b_TypeofStarter_c   '('   a_TypeName_c   ')'
a_TypeSpecifier_c  ::=  b_TypeofStarter_c   '('   a_Expr_c   ')'
a_TypeSpecifier_c  ::=  '_Float128'
a_TypeSpecifier_c  ::=  '__int128'
a_TypeSpecifier_c  ::=  'void'
a_TypeSpecifier_c  ::=  'char'
a_TypeSpecifier_c  ::=  'short'
a_TypeSpecifier_c  ::=  'int'
a_TypeSpecifier_c  ::=  'long'
a_TypeSpecifier_c  ::=  'float'
a_TypeSpecifier_c  ::=  'double'
a_TypeSpecifier_c  ::=  'signed'
a_TypeSpecifier_c  ::=  'unsigned'
a_TypeSpecifier_c  ::=  '_Bool'
a_TypeSpecifier_c  ::=  '_Imaginary'
a_TypeSpecifier_c  ::=  '_Complex'
a_TypeSpecifier_c  ::=  a_StructOrUnionSpecifier_c
a_TypeSpecifier_c  ::=  a_EnumSpecifier_c
a_TypeSpecifier_c  ::=  a_TypeIdName_c
a_TypeSpecifier_c  ::=  'closure'   '<'    q_ClosureTypeExpr_c   '>'
a_TypeSpecifier_c  ::=  'list'   '<'    a_TypeName_c   '>'
a_TypeSpecifier_c  ::=  'string'
a_TypeSpecifier_c  ::=  r_TemplateTypeName_t   '<'    o_TemplateArguments_c   '>'
a_TypeSpecifier_c  ::=  'inst'   a_TypeIdName_c   '<'    o_TemplateArguments_c   '>'
a_TypeSpecifier_c  ::=  'vector'   '<'    a_TypeName_c   '>'
a_UnaryExpr_c  ::=  '_Alignof'   '('   a_TypeName_c   ')'
a_UnaryExpr_c  ::=  '__alignof'   a_UnaryExpr_c
a_UnaryExpr_c  ::=  '__alignof'   '('   a_TypeName_c   ')'
a_UnaryExpr_c  ::=  '__alignof__'   a_UnaryExpr_c
a_UnaryExpr_c  ::=  '__alignof__'   '('   a_TypeName_c   ')'
a_UnaryExpr_c  ::=  '&&'   a_Identifier_c
a_UnaryExpr_c  ::=  a_PostfixExpr_c
a_UnaryExpr_c  ::=  '++'   a_UnaryExpr_c
a_UnaryExpr_c  ::=  '--'   a_UnaryExpr_c
a_UnaryExpr_c  ::=  a_UnaryOp_c   a_CastExpr_c
a_UnaryExpr_c  ::=  'sizeof'   a_UnaryExpr_c
a_UnaryExpr_c  ::=  'sizeof'   '('   a_TypeName_c   ')'
a_UnaryExpr_c  ::=  n_TemplateIdentifier_t   '<'    o_TemplateArguments_c   '>'
a_UnaryExpr_c  ::=  'inst'   a_Identifier_c   '<'    o_TemplateArguments_c   '>'
a_UnaryOp_c  ::=  '__extension__'
a_UnaryOp_c  ::=  '__real'
a_UnaryOp_c  ::=  '__real__'
a_UnaryOp_c  ::=  '__imag'
a_UnaryOp_c  ::=  '__imag__'
a_UnaryOp_c  ::=  '&'
a_UnaryOp_c  ::=  '*'
a_UnaryOp_c  ::=  '+'
a_UnaryOp_c  ::=  '-'
a_UnaryOp_c  ::=  '~'
a_UnaryOp_c  ::=  '!'
c_AlignmentSpecifier_c  ::=  '_Alignas'   '('   a_TypeName_c   ')'
c_AlignmentSpecifier_c  ::=  '_Alignas'   '('   a_ConstantExpr_c   ')'
c_GenericAssocList_c  ::=  c_GenericAssoc_c
c_GenericAssocList_c  ::=  c_GenericAssocList_c   ','   c_GenericAssoc_c
c_GenericAssoc_c  ::=  a_TypeName_c   ':'   a_AssignExpr_c
c_GenericAssoc_c  ::=  'default'   ':'   a_AssignExpr_c
c_GenericSelection_c  ::=  '_Generic'   '('   a_AssignExpr_c   ','   c_GenericAssocList_c   ')'
c_StaticAssertDeclaration_c  ::=  '_Static_assert'   '('   a_ConstantExpr_c   ','   a_StringConstant_c   ')'   ';'
b_AsmArgument_c  ::=  a_StringConstant_c   ':'   ':'   ':'   b_AsmClobbers_c
b_AsmArgument_c  ::=  a_StringConstant_c
b_AsmArgument_c  ::=  a_StringConstant_c   ':'   b_AsmOperands_c
b_AsmArgument_c  ::=  a_StringConstant_c   ':'
b_AsmArgument_c  ::=  a_StringConstant_c   ':'   b_AsmOperands_c   ':'   b_AsmOperands_c
b_AsmArgument_c  ::=  a_StringConstant_c   ':'   ':'   b_AsmOperands_c
b_AsmArgument_c  ::=  a_StringConstant_c   ':'   b_AsmOperands_c   ':'
b_AsmArgument_c  ::=  a_StringConstant_c   ':'   ':'
b_AsmArgument_c  ::=  a_StringConstant_c   ':'   b_AsmOperands_c   ':'   b_AsmOperands_c   ':'   b_AsmClobbers_c
b_AsmArgument_c  ::=  a_StringConstant_c   ':'   ':'   b_AsmOperands_c   ':'   b_AsmClobbers_c
b_AsmArgument_c  ::=  a_StringConstant_c   ':'   b_AsmOperands_c   ':'   ':'   b_AsmClobbers_c
b_AsmClobbers_c  ::=  a_StringConstant_t
b_AsmClobbers_c  ::=  b_AsmClobbers_c   ','   a_StringConstant_t
b_AsmOperand_c  ::=  a_StringConstant_t   '('   a_Expr_c   ')'
b_AsmOperand_c  ::=  '['    a_Identifier_c   ']'   a_StringConstant_t   '('   a_Expr_c   ')'
b_AsmOperands_c  ::=  b_AsmOperand_c
b_AsmOperands_c  ::=  b_AsmOperands_c   ','   b_AsmOperand_c
b_Asm_Starter_c  ::=  'asm'
b_Asm_Starter_c  ::=  '__asm__'
b_Asm_Starter_c  ::=  '__asm'
b_Asm_Statement_c  ::=  b_Asm_Starter_c   a_TypeQualifier_c   '('   b_AsmArgument_c   ')'   ';'
b_Asm_Statement_c  ::=  b_Asm_Starter_c   '('   b_AsmArgument_c   ')'   ';'
b_AttribName_c  ::=  b_AttributeNameUnfetterdByKeywords_t
b_Attrib_c  ::=
b_Attrib_c  ::=  b_AttribName_c
b_Attrib_c  ::=  b_AttribName_c   '('   a_ArgumentExprList_c   ')'
b_AttributeList_c  ::=  b_Attrib_c
b_AttributeList_c  ::=  b_AttributeList_c   ','   b_Attrib_c
b_Attribute_c  ::=  '__attribute__'   '('   '('   b_AttributeList_c   ')'   ')'
b_Attribute_c  ::=  '__attribute'   '('   '('   b_AttributeList_c   ')'   ')'
b_Attributes_c  ::=  b_Attribute_c
b_Attributes_c  ::=  b_Attribute_c   b_Attributes_c
b_InitialNestedFunctionDefinition_c  ::=  a_DeclarationSpecifiers_c   a_Declarator_c
b_LabelDeclaration_c  ::=  '__label__'   a_IdentifierList_c   ';'
b_LabelDeclarations_c  ::=  b_LabelDeclaration_c
b_LabelDeclarations_c  ::=  b_LabelDeclarations_c   b_LabelDeclaration_c
b_MemberDesignator_c  ::=  b_MemberDesignator_c   '->'   a_Identifier_c
b_MemberDesignator_c  ::=  b_MemberDesignator_c   '['    a_ConstantExpr_c   ']'
b_MemberDesignator_c  ::=  a_Identifier_c
b_MemberDesignator_c  ::=  b_MemberDesignator_c   '.'   a_Identifier_c
b_NestedFunctionDefinition_c  ::=  b_InitialNestedFunctionDefinition_c   a_CompoundStatement_c
b_SimpleAsmStatement_c  ::=  b_Asm_Starter_c   '('   a_StringConstant_c   ')'
b_TypeofStarter_c  ::=  'typeof'
b_TypeofStarter_c  ::=  '__typeof__'
b_TypeofStarter_c  ::=  '__typeof'
d_ConstructorList_c  ::=  d_Constructor_c   d_ConstructorList_c
d_ConstructorList_c  ::=
d_Constructor_c  ::=  a_Identifier_c   '('   a_ParameterTypeList_c   ')'   ';'
d_Constructor_c  ::=  a_Identifier_c   '('   ')'   ';'
l_BasicPattern_c  ::=  a_Identifier_c   '('   l_PatternList_c   ')'
l_BasicPattern_c  ::=  a_Identifier_c   '('   ')'
l_BasicPattern_c  ::=  '{'    l_StructPatternList_c   '}'
l_BasicPattern_c  ::=  '{'    '}'
l_BasicPattern_c  ::=  a_Identifier_t
l_BasicPattern_c  ::=  'when'   '('   a_Expr_c   ')'
l_BasicPattern_c  ::=  '('   l_Pattern_c   ')'
l_BasicPattern_c  ::=  '['    m_ListPatternList_c   ']'
l_BasicPattern_c  ::=  'freevar'
l_ExprClause_c  ::=  l_OpenScope_t   l_PatternList_c   '->'   a_Expr_c   ';'
l_ExprClauses_c  ::=  l_ExprClause_c   l_ExprClauses_c
l_ExprClauses_c  ::=
l_NonConstPattern_c  ::=  l_NonConstPattern_c   '@'   l_NonConstPattern_c
l_NonConstPattern_c  ::=  '!'    l_NonConstPattern_c
l_NonConstPattern_c  ::=  '&'    l_NonConstPattern_c
l_NonConstPattern_c  ::=  l_BasicPattern_c
l_PatternList_c  ::=  l_Pattern_c   ','   l_PatternList_c
l_PatternList_c  ::=  l_Pattern_c
l_Pattern_c  ::=  a_Constant_c
l_Pattern_c  ::=  '('   a_TypeName_c   ')'   a_Constant_c
l_Pattern_c  ::=  a_StringConstant_c
l_Pattern_c  ::=  l_NonConstPattern_c   '@'   l_Pattern_c
l_Pattern_c  ::=  '!'    l_Pattern_c
l_Pattern_c  ::=  '&'    l_Pattern_c
l_Pattern_c  ::=  l_BasicPattern_c
l_Pattern_c  ::=  'PatternNEVER_t123456789!!!never'   l_Pattern_c   ']'
l_Pattern_c  ::=  'PatternNEVER_t123456789!!!never'   l_Pattern_c   '|'
l_Pattern_c  ::=  '?&'   l_Pattern_c
l_StmtClause_c  ::=  l_OpenScope_t   l_PatternList_c   '->'   '{'    a_BlockItemList_c   '}'
l_StmtClause_c  ::=  l_OpenScope_t   l_PatternList_c   '->'   '{'    '}'
l_StmtClauses_c  ::=  l_StmtClause_c   l_StmtClauses_c
l_StmtClauses_c  ::=
l_StructPatternList_c  ::=  l_StructPattern_c   ','   l_StructPatternList_c
l_StructPatternList_c  ::=  l_StructPattern_c
l_StructPattern_c  ::=  l_Pattern_c
l_StructPattern_c  ::=  '.'   a_Identifier_c   '='   l_Pattern_c
q_ClosureParameterList_c  ::=  a_ParameterDeclaration_c
q_ClosureParameterList_c  ::=  q_ClosureParameterList_c   ','   a_ParameterDeclaration_c
q_ClosureTypeExpr_c  ::=  '('   q_ClosureTypeExpr_c   ')'   '->'   a_TypeName_c
q_ClosureTypeExpr_c  ::=  '('   q_ClosureTypeExpr_c   ')'   '->'   q_ClosureTypeExpr_c
q_ClosureTypeExpr_c  ::=  '('   q_ClosureParameterList_c   ')'   '->'   q_ClosureTypeExpr_c
q_ClosureTypeExpr_c  ::=  '('   q_ClosureParameterList_c   ')'   '->'   a_TypeName_c
q_ClosureTypeExpr_c  ::=  '('   ')'   '->'   q_ClosureTypeExpr_c
q_ClosureTypeExpr_c  ::=  '('   ')'   '->'   a_TypeName_c
e_Body_c  ::=  e_Goal_c   ','   e_Body_c
e_Body_c  ::=  e_Goal_c
e_Goal_c  ::=  a_Identifier_c   '<'    o_TemplateArguments_c   '>'   '('   e_LogicExprs_c   ')'
e_Goal_c  ::=  a_Identifier_c   '<'    o_TemplateArguments_c   '>'   '('   ')'
e_Goal_c  ::=  a_Identifier_c   '('   e_LogicExprs_c   ')'
e_Goal_c  ::=  a_Identifier_c   '('   ')'
e_Goal_c  ::=  e_LogicExpr_c   'is'   e_PrologPrimaryExpr_c
e_Goal_c  ::=  e_LogicExpr_c   '='   e_LogicExpr_c
e_Goal_c  ::=  e_LogicExpr_c   '\='   e_LogicExpr_c
e_Goal_c  ::=  e_PrologPrimaryExpr_c   '=:='   e_PrologPrimaryExpr_c
e_Goal_c  ::=  e_PrologPrimaryExpr_c   '=\='   e_PrologPrimaryExpr_c
e_Goal_c  ::=  e_PrologPrimaryExpr_c   '<'    e_PrologPrimaryExpr_c
e_Goal_c  ::=  e_PrologPrimaryExpr_c   '=<'   e_PrologPrimaryExpr_c
e_Goal_c  ::=  e_PrologPrimaryExpr_c   '>'   e_PrologPrimaryExpr_c
e_Goal_c  ::=  e_PrologPrimaryExpr_c   '>='   e_PrologPrimaryExpr_c
e_Goal_c  ::=  '\+'   e_Goal_c
e_Goal_c  ::=  '!'
e_Goal_c  ::=  'initially'   '{'    a_BlockItemList_c   '}'
e_Goal_c  ::=  'initially'   '{'    '}'
e_Goal_c  ::=  'finally'   '{'    a_BlockItemList_c   '}'
e_Goal_c  ::=  'finally'   '{'    '}'
e_Head_c  ::=  a_Identifier_c   '('   e_LogicExprs_c   ')'
e_Head_c  ::=  a_Identifier_c   '('   ')'
e_LogicExpr_c  ::=  a_Identifier_t
e_LogicExpr_c  ::=  e_PrologConstant_c
e_LogicExpr_c  ::=  '-'   e_PrologConstant_c
e_LogicExpr_c  ::=  a_StringConstant_t
e_LogicExpr_c  ::=  a_Identifier_c   '('   e_LogicExprs_c   ')'
e_LogicExpr_c  ::=  a_Identifier_c   '('   ')'
e_LogicExpr_c  ::=  'LogicExprNEVER_t123456789!!!never'   e_LogicExpr_c   ']'
e_LogicExpr_c  ::=  'LogicExprNEVER_t123456789!!!never'   e_LogicExpr_c   '|'
e_LogicExpr_c  ::=  '['    m_ListLogicExprList_c   ']'
e_LogicExprs_c  ::=  e_LogicExpr_c   ','   e_LogicExprs_c
e_LogicExprs_c  ::=  e_LogicExpr_c
e_LogicStmt_c  ::=  a_Identifier_c   '('   a_ParameterTypeList_c   ')'   ';'
e_LogicStmt_c  ::=  a_Identifier_c   '('   ')'   ';'
e_LogicStmt_c  ::=  e_Head_c   '.'
e_LogicStmt_c  ::=  e_Head_c   ':-'   e_Body_c   '.'
e_LogicStmt_c  ::=  a_Identifier_c   '<'    g_TemplateParameters_c   '>'   '('   a_ParameterTypeList_c   ')'   ';'
e_LogicStmt_c  ::=  a_Identifier_c   '<'    g_TemplateParameters_c   '>'   '('   ')'   ';'
e_LogicStmts_c  ::=  e_LogicStmt_c   e_LogicStmts_c
e_LogicStmts_c  ::=
e_PrologConstant_c  ::=  a_DecConstant_t
e_PrologConstant_c  ::=  a_DecConstantU_t
e_PrologConstant_c  ::=  a_DecConstantL_t
e_PrologConstant_c  ::=  a_DecConstantUL_t
e_PrologConstant_c  ::=  a_DecConstantLL_t
e_PrologConstant_c  ::=  a_DecConstantULL_t
e_PrologConstant_c  ::=  a_OctConstant_t
e_PrologConstant_c  ::=  a_OctConstantU_t
e_PrologConstant_c  ::=  a_OctConstantL_t
e_PrologConstant_c  ::=  a_OctConstantUL_t
e_PrologConstant_c  ::=  a_OctConstantLL_t
e_PrologConstant_c  ::=  a_OctConstantULL_t
e_PrologConstant_c  ::=  a_OctConstantError_t
e_PrologConstant_c  ::=  a_HexConstant_t
e_PrologConstant_c  ::=  a_HexConstantU_t
e_PrologConstant_c  ::=  a_HexConstantL_t
e_PrologConstant_c  ::=  a_HexConstantUL_t
e_PrologConstant_c  ::=  a_HexConstantLL_t
e_PrologConstant_c  ::=  a_HexConstantULL_t
e_PrologConstant_c  ::=  a_FloatConstant_t
e_PrologConstant_c  ::=  a_FloatConstantFloat_t
e_PrologConstant_c  ::=  a_FloatConstantLongDouble_t
e_PrologConstant_c  ::=  a_HexFloatConstant_t
e_PrologConstant_c  ::=  a_HexFloatConstantFloat_t
e_PrologConstant_c  ::=  a_HexFloatConstantLongDouble_t
e_PrologConstant_c  ::=  a_CharConstant_t
e_PrologConstant_c  ::=  a_CharConstantL_t
e_PrologConstant_c  ::=  a_CharConstantU_t
e_PrologConstant_c  ::=  a_CharConstantUBig_t
e_PrologPrimaryExpr_c  ::=  a_Identifier_t
e_PrologPrimaryExpr_c  ::=  e_PrologConstant_c
e_PrologPrimaryExpr_c  ::=  a_StringConstant_t
e_PrologPrimaryExpr_c  ::=  '('   a_Expr_c   ')'
m_ListInitializerList_c  ::=  a_AssignExpr_c   ','   m_ListInitializerList_c
m_ListInitializerList_c  ::=  a_AssignExpr_c
m_ListInitializerList_c  ::=
m_ListLogicExprList_c  ::=  e_LogicExpr_c   ','   m_ListLogicExprList_c
m_ListLogicExprList_c  ::=  e_LogicExpr_c
m_ListLogicExprList_c  ::=  e_LogicExpr_c   '|'   e_LogicExpr_c
m_ListLogicExprList_c  ::=
m_ListPatternList_c  ::=  l_Pattern_c   ','   m_ListPatternList_c
m_ListPatternList_c  ::=  l_Pattern_c
m_ListPatternList_c  ::=  l_Pattern_c   '|'   l_Pattern_c
m_ListPatternList_c  ::=
j_TagKeyword_c  ::=  'datatype'
j_TagKeyword_c  ::=  'enum'
j_TagKeyword_c  ::=  'struct'
j_TagKeyword_c  ::=  'union'
f_TemplateInitialDatatypeDeclaration_c  ::=  '<'    g_TemplateParameters_c   '>'   'datatype'    a_Identifier_c
s_MaybeAttributes_c  ::=  b_Attributes_c
s_MaybeAttributes_c  ::=
o_TemplateArgument_c  ::=  a_TypeName_c
o_TemplateArgument_c  ::=  a_Identifier_c
o_TemplateArgument_c  ::=  a_Constant_c
o_TemplateArguments_c  ::=  o_TemplateArgument_c   ','   o_TemplateArguments_c
o_TemplateArguments_c  ::=  o_TemplateArgument_c
o_TemplateArguments_c  ::=
h_TemplateInitialFunctionDefinition_c  ::=  a_DeclarationSpecifiers_c   a_Declarator_c   a_InitiallyUnqualifiedDeclarationList_c
h_TemplateInitialFunctionDefinition_c  ::=  a_Declarator_c   a_InitiallyUnqualifiedDeclarationList_c
g_TemplateParameter_c  ::=  'typename'   a_Identifier_c
g_TemplateParameter_c  ::=  a_DeclarationSpecifiers_c   a_Declarator_c
g_TemplateParameters_c  ::=  g_OpenScope_t   g_TemplateParams_c
g_TemplateParams_c  ::=  g_TemplateParameter_c   ','   g_TemplateParams_c
g_TemplateParams_c  ::=  g_TemplateParameter_c
g_TemplateParams_c  ::=
i_TemplateInitialStructDeclaration_c  ::=  '<'    g_TemplateParameters_c   '>'   'struct'    s_MaybeAttributes_c   a_Identifier_c
k_InitiallyUnattributedTypeQualifierList_c  ::=  a_TypeQualifier_c
k_InitiallyUnattributedTypeQualifierList_c  ::=  a_TypeQualifier_c   a_TypeQualifierList_c
p_VectorConstructorExprList_c  ::=  a_AssignExpr_c
p_VectorConstructorExprList_c  ::=  p_VectorConstructorExprList_c   ','   a_AssignExpr_c

@mingodad
Copy link
Author

mingodad commented Feb 11, 2023

I've created a script to extract an EBNF to be viewed on https://www.bottlecaps.de/rr/ui from the --copperdump report generated by silver[-ableC]:

//auto fname = "ableC-sample-projects/down_on_the_farm/Parser_artifact_extendedParser.html";
//auto fname = "ableC/Parser_edu_umn_cs_melt_ableC_host_ablecParser.html";
//auto fname = "silver/build/Parser_silver_compiler_composed_Default_svParse.html";
auto fname = "ableC-bundle/extensions/ableC-prolog/examples/Parser_artifact_extendedParser.html";
auto fd = file(fname, "r");
auto line = "";
auto inProduction = false;
auto startProduction = 0;
auto endProduction = 0;
auto last_short_prefix = 'a';
auto short_prefixes = {};
auto grammar_start_at;
auto ebnf_lines = [];
while((line = fd.read_line())) {
	//print(line);
	//break;
	if(line == "            <h1>Productions</h1>") {
		//print(line); break;
		inProduction = true;
		startProduction = fd.tell();
	}
	if(inProduction) {
		//print(line);
		if(line == "            </table>") {
			endProduction = fd.tell();
			print(startProduction, endProduction);
			fd.seek(startProduction);
			auto html = fd.read(endProduction-startProduction);
			html.gmatch(
				"<tr[^>]+>(.-)</tr>",
				function(m)
				{
					m = m.replace("\n", " ");
					m = m.gsub("<[^>]+>", " ");
					m = m.gsub("^%s+%d+%s+", "");
					m = m.replace("&lt;", "<");
					m = m.replace("&gt;", ">");
					m = m.replace("&amp;", "&");
					m = m.gsub("%(%w[^%s)]+%)", "");
					if(m[0] == '^') {
						//m = "//" + m;
						grammar_start_at = m.match("::=%s+(%S+)");
						return true;
					}
					//m = m.gsub("%s+", " ");
					m = m.gsub("%S+%s+$", "");
					m.gmatch(
						"%w+:%S+",
						function(m) {
							auto prefix = m.match("(.-:)[^:]+$");
							auto rec = table_rawget(short_prefixes, prefix, false);
							if(!rec) {
								table_rawset(short_prefixes, prefix, last_short_prefix++);
							}
							//print(prefix, m);
							return true;
						}
					);
					//print(m);
					ebnf_lines.append(m);
					return true;
				}
			);
			//html = html.gsub("<td class=\"fixedcell\">.-</td>(%s+</tr>)", "%1");
			//html = html.gsub("<[^>]+>", "");
			//print(html);
			break;
		}
	}
}

function getWithShortPrefix(name) {
	if(table_len(short_prefixes) == 0) return name;
	auto prefix = name.match("(.-:)[^:]+$");
	auto rec = table_rawget(short_prefixes, prefix, false);
	if(!rec) {
		throw("unexpected prefix = ", prefix);
	}
	//print(prefix, m);
	return name.gsub("(.-:)([^:]+)$", rec.tochar() + "_%2");
}

//write short_prefixes
printf("grammar_start_at ::= %s\n\t| notes_for_railroad\nnotes_for_railroad ::=\n", getWithShortPrefix(grammar_start_at));
auto ary = table_toarray(short_prefixes);
ary.sort(@(a,b) a[1] <=> b[1]);
foreach(elm in ary) printf("\t| '%s_ prefix for %s'\n", elm[1].tochar(), elm[0]);

foreach(line in ebnf_lines) {
	line = line.gsub("%w+:%S+",
			function(m) {
				return getWithShortPrefix(m);
			}
		);

	print(line);
}

It uses Lua pattern matching/regex to search and replace transformations on the html generated by --copperdump it's written in SquiLu (https://github.com/mingodad/squilu).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants