# `nimbleparse` `nimbleparse` is a simple grammar debugging aid. It takes as input a Lex specification, a Yacc specification, and an input file and prints any warnings about the specifications (e.g. shift/reduce errors) as well as the resulting parse tree to stdout. If the parse is unsuccessful it will report parsing errors and, when possible fixes. If parsing is successful, `nimbleparse` exits with 0; if an error is detected it exits with 1. The full command-line specification is as follows: ``` nimbleparse [-r ] [-y ] [-q] ``` where: * `-r` selects the recovery algorithm to be used. Defaults to `cpctplus`. * `-y` selects the Yacc variant to be used. Defaults to `original`. * `-q` prevents warnings (e.g. shift/reduce errors) from being reported. You can use your own Lex/Yacc files. A small repository of example grammars can be found at https://github.com/softdevteam/grammars/. An example invocation is as follows: ``` $ cat Hello.java class Hello { public static void main(String[] args) { System.out.println("Hello world"); } } $ nimbleparse java7.l java7.y Hello.java goal compilation_unit type_declarations_opt type_declarations type_declaration class_declaration modifiers_opt CLASS class IDENTIFIER Hello type_parameters_opt super_opt interfaces_opt class_body LBRACE { class_body_declarations_opt class_body_declarations class_body_declaration class_member_declaration method_declaration method_header modifiers_opt modifiers modifiers modifier PUBLIC public modifier STATIC static VOID void method_declarator IDENTIFIER main LPAREN ( formal_parameter_list_opt formal_parameter_list formal_parameter type reference_type array_type name simple_name IDENTIFIER String dims LBRACK [ RBRACK ] variable_declarator_id IDENTIFIER args RPAREN ) throws_opt method_body block LBRACE { block_statements_opt block_statements block_statement statement statement_without_trailing_substatement expression_statement statement_expression method_invocation qualified_name name qualified_name name simple_name IDENTIFIER System DOT . IDENTIFIER out DOT . IDENTIFIER println LPAREN ( argument_list_opt argument_list expression assignment_expression conditional_expression conditional_or_expression conditional_and_expression inclusive_or_expression exclusive_or_expression and_expression equality_expression instanceof_expression relational_expression shift_expression additive_expression multiplicative_expression unary_expression unary_expression_not_plus_minus postfix_expression primary primary_no_new_array literal STRING_LITERAL "Hello world" RPAREN ) SEMICOLON ; RBRACE } RBRACE } $ cat SyntaxError.java class SyntaxError { int x y; } $ nimbleparse java7.l java7.y Hello.java goal compilation_unit type_declarations_opt type_declarations type_declaration class_declaration modifiers_opt CLASS class IDENTIFIER SyntaxError type_parameters_opt super_opt interfaces_opt class_body LBRACE { class_body_declarations_opt class_body_declarations class_body_declaration class_member_declaration field_declaration modifiers_opt type primitive_type numeric_type integral_type INT int variable_declarators variable_declarators variable_declarator variable_declarator_id IDENTIFIER x COMMA variable_declarator variable_declarator_id IDENTIFIER y SEMICOLON ; RBRACE } Parsing error at line 2 column 11. Repair sequences found: 1: Insert , 2: Insert = 3: Delete y ```