1 个不稳定版本
| 0.1.0 | 2020年2月20日 |
|---|
#265 在 解析工具
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。它显示此语法中的终结符是a和b。然后显示此语法中的 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(这在生成式#2A : 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