19 个版本

0.13.7 2024年6月14日
0.13.4 2024年1月4日
0.13.3 2023年9月21日
0.13.1 2023年1月27日
0.9.0 2020年7月6日

#9 in 解析工具

Download history 156/week @ 2024-05-03 5/week @ 2024-05-10 10/week @ 2024-05-17 89/week @ 2024-05-24 47/week @ 2024-05-31 9/week @ 2024-06-07 164/week @ 2024-06-14 20/week @ 2024-06-21 21/week @ 2024-07-05

1,065 每月下载量

Apache-2.0/MIT

650KB
14K SLoC

nimbleparse

nimbleparse 是一个简单的语法调试助手。它接受 Lex 规范、Yacc 规范和输入文件作为输入,并将有关规范(例如,移位/归约错误)的任何警告以及生成的解析树打印到 stdout。如果解析失败,它将报告解析错误和可能的修复。如果解析成功,nimbleparse 将退出代码为 0;如果检测到错误,则退出代码为 1。

完整的命令行规范如下

nimbleparse [-r <cpctplus|none>] [-y <eco|grmtools|original>] [-q] <lexer.l> <parser.y> <input file>

其中

  • -r 选择要使用的恢复算法。默认为 cpctplus
  • - 选择要使用的 Yacc 变体。默认为 original
  • - 防止报告警告(例如,移位/归约错误)。

您可以使用自己的 Lex/Yacc 文件。可以在 https://github.com/softdevteam/grammars/ 找到一个小型的示例语法存储库。

一个示例调用如下

$ 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

依赖关系

~4–13MB
~143K SLoC