1 个不稳定版本

0.1.0 2020年2月20日

#265解析工具

MIT/Apache

30KB
625

denuocc grammar_tool

此工具旨在帮助开发 预测性递归下降解析器

grammar_tool 有四个主要子命令

  • print 显示并编号语法中的每个生成式

    $ cargo run -- print ./grammars/aho_ullman/example_5.3.yacc
    start: S
    terminals: a b
    0 S :  ;
    1 S : a b A ;
    2 A : S a a ;
    3 A : b ;
    

    它显示了 start 非终结符,恰好是 S。它显示此语法中的终结符是 ab。然后显示此语法中的 4 个生成式。

  • first 显示语法中每个非终结符的第一集合

    $ cargo run -- first -k2 ./grammars/aho_ullman/example_5.3.yacc 
    S : 
    S : a b
    A : a a
    A : a b
    A : b
    

    这意味着生成式 S 可以以空字符串或令牌字符串 "ab" 开头。类似地,非终结符 A 可以以令牌字符串 "aa""ab" 或仅 "b" 开始。值得注意的是,A 不能是空字符串。

  • follow 显示语法中每个非终结符的 follow 集合

    $ cargo run -- follow -k2 ./grammars/aho_ullman/example_5.3.yacc 
    S :
    S : a a
    A : 
    

    S : 后面没有内容的行表示输入字符串在解析 S 后可以结束。对于 A : 行也是如此。行 S : a a 表示令牌字符串 "aa" 有时可以在解析 S 后合法出现。

  • test 将验证语法是否是 LL(k) 或解释为什么它不是

    $ cargo run -- test -k1 ./grammars/aho_ullman/example_5.3.yacc 
    grammar is not LL(1)
    $ cargo run -- test -k1 --explain ./grammars/aho_ullman/example_5.3.yacc 
    productions [0, 1] cause LL-conflicts: [["a"]]
      production 0   S : ;
      production 1   S : a b A;
      conflicting suffix: ["a"]
    grammar is not LL(1)
    $ cargo run -- test -k2 ./grammars/aho_ullman/example_5.3.yacc 
    grammar is strong LL(2)
    

    如《follow》命令所示,一个S生成式可能后接序列a a(这在生成式#2 A : S a a中出现)。因此,仅凭1个标记的先行符号,无法确定选择哪一个S生成式。

语法

grammar_tool接受一个类似于YACC的非常简单的语法格式。输入被分为两部分:头和体,由一个只有%%的行分开。

头可以包含一个%token%start行。%token行声明了终结符标识符。而%start行指定了哪个非终结符是语法的根。

体包含每个非终结符的定义。定义可能使用|字符提供多个生成式。如果生成式中引用的任何标识符没有在%token头中声明,则假定它是一个非终结符。生成式中的引号字符串也是一个终结符。

%token TERMINAL
%start S
%%

S : variant1
  | variant2
  ;

variant1 : TERMINAL TERMINAL;
variant2 : "terminal" ;

许可证

本项目根据MIT许可证和Apache许可证版本2.0的双重许可条款。有关详细信息,请参阅./LICENSE-MIT./LICENSE-APACHE

贡献

除非您明确声明,否则根据Apache-2.0许可证定义的任何旨在包含在您的工作中的贡献,都将如上所述进行双重许可,不附加任何其他条款或条件。

依赖关系

~2.7–4.5MB
~76K SLoC