nimbleparse 0.14.2

Simple Yacc grammar debugging tool
# `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 <cpctplus|none>] [-y <eco|grmtools|original>] [-q] <lexer.l> <parser.y> <input file>
```

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
```