copper icon indicating copy to clipboard operation
copper copied to clipboard

Grammar railroad diagram

Open mingodad opened this issue 2 years ago • 8 comments

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 avatar Feb 09 '23 20:02 mingodad

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 avatar Feb 10 '23 11:02 mingodad

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'

mingodad avatar Feb 10 '23 11:02 mingodad

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

ericvanwyk avatar Feb 10 '23 13:02 ericvanwyk

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 avatar Feb 10 '23 13:02 mingodad

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

mingodad avatar Feb 10 '23 17:02 mingodad

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 avatar Feb 10 '23 18:02 mingodad

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 avatar Feb 11 '23 10:02 mingodad

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

mingodad avatar Feb 11 '23 10:02 mingodad