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