我有一个语法包含:
constant ::= integer-literal
| char-literal
∣ string-literal
expression ::= constant
pattern ::= constant | char-literal .. char-literal
我刚开始进行递归下降解析,想知道如何构建代码以基本上重用constant
解析。问题是,当我看到char-literal
时,我不能只解析pattern
中的常量。如果下一个令牌是..
,则它是另一种模式。
想象一下有以下代码:
let parseConstant p =
match p.token with
| Int i -> Const_int (int_of_string i)
| String s -> Const_string (s, None)
| Char c -> Const_char c
如何构造parseExpression
和parsePattern
函数以重用parseConstant
?还是我只是为模式创建一个不同的parsePatternConstantMaybeDotDotOtherGrammarThing
函数?
我可能要做的是让pattern
的代码调用parseConstant
。然后看下一个令牌。如果是..
,那么如果常量是字符常量,则可以解析字符范围的其余部分。如果常量不是字符常量,则存在语法错误。如果下一个令牌不是..
,那么您就完成了对模式的解析。
递归下降语法分析器压力低的原因是,您可以直接对任何奇怪的情况进行编码。您不必使它们适合解析框架——这只是代码。要付出的代价是你必须编写代码,并且要小心把它做好。