Parsing 如何根据代码共享构造递归下降函数?

Parsing 如何根据代码共享构造递归下降函数?,parsing,ocaml,Parsing,Ocaml,我的语法包含: constant ::= integer-literal | char-literal ∣ string-literal expression ::= constant pattern ::= constant | char-literal .. char-literal 我刚刚开始递归下降解析,我想知道如何构造我的代码,以便基本上重用常量解析。问题是,当我看到字符文本时,我不能只解析模式中的常量。 如果下一个标记是。,则它是另一种模式 想象一下拥有以下代码: let pa

我的语法包含:

constant ::= integer-literal
| char-literal
∣ string-literal

expression ::= constant

pattern ::= constant | char-literal .. char-literal
我刚刚开始递归下降解析,我想知道如何构造我的代码,以便基本上重用
常量
解析。问题是,当我看到
字符文本时,我不能只解析
模式中的常量。
如果下一个标记是
,则它是另一种模式

想象一下拥有以下代码:

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
?或者我只是为模式创建一个不同的
parsePatternConstantMaybedTotherGrammarthing
函数吗?

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


递归下降解析器压力小的原因是您可以直接编写任何奇数情况。您不必使它们适合解析框架——它只是代码。要付出的代价是,你必须编写代码,并小心地将其正确无误。

谢谢你的指导!