我有一个语法,其中包含:
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
函数?
答案 0 :(得分:1)
我可能要做的是让pattern
调用parseConstant
的代码。然后查看下一个令牌。如果它是..
,则如果常量是字符常量,则可以解析其余字符范围。如果常量不是字符常量,则语法错误。如果下一个标记不是..
,则说明您已经解析了模式。
递归下降解析器的压力很低是因为您可以直接编写任何奇数情况。您不必使它们适合解析框架,而只是代码。需要付出的代价是必须编写代码,并且要小心正确。