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

时间:2018-12-07 21:34:05

标签: parsing ocaml

我有一个语法,其中包含:

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函数?

1 个答案:

答案 0 :(得分:1)

我可能要做的是让pattern调用parseConstant的代码。然后查看下一个令牌。如果它是..,则如果常量是字符常量,则可以解析其余字符范围。如果常量不是字符常量,则语法错误。如果下一个标记不是..,则说明您已经解析了模式。

递归下降解析器的压力很低是因为您可以直接编写任何奇数情况。您不必使它们适合解析框架,而只是代码。需要付出的代价是必须编写代码,并且要小心正确。