如何在代码共享方面构造递归下降函数



我有一个语法包含:

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

如何构造parseExpressionparsePattern函数以重用parseConstant?还是我只是为模式创建一个不同的parsePatternConstantMaybeDotDotOtherGrammarThing函数?

我可能要做的是让pattern的代码调用parseConstant。然后看下一个令牌。如果是..,那么如果常量是字符常量,则可以解析字符范围的其余部分。如果常量不是字符常量,则存在语法错误。如果下一个令牌不是..,那么您就完成了对模式的解析。

递归下降语法分析器压力低的原因是,您可以直接对任何奇怪的情况进行编码。您不必使它们适合解析框架——这只是代码。要付出的代价是你必须编写代码,并且要小心把它做好。

最新更新