我正在 ocamllex 和 ocamlyacc 中编写一个词法分析器和解析器,如下所示。function_name和table_name是相同的正则表达式,即只包含英文字母的字符串。确定字符串是否是function_name或是table_name检查其周围环境的唯一方法。例如,如果这样的字符串被[and包围],那么我们就知道它是 a table_name。这是当前代码:
在lexer.mll,
... ...
let function_name = ['a'-'z' 'A'-'Z']+
let table_name = ['a'-'z' 'A'-'Z']+
rule token = parse
| function_name as s { FUNCTIONNAME s }
| table_name as s { TABLENAME s }
... ...
在parser.mly:
... ...
main:
| LBRACKET TABLENAME RBRACKET { Table $2 }
... ...
正如我| function_name as s { FUNCTIONNAME s }之前写| table_name as s { TABLENAME s }的,上面的代码无法解析[haha];它首先在词法分析器中被认为haha是a function_name,然后在解析器中找不到任何对应的规则。如果它可以在词法分析器中被haha视为 a table_name,那么它将[haha]在解析器中匹配为表。
一种解决方法是在词法分析器中更精确。例如,我们在词法分析器中定义let table_name_with_brackets = '[' ['a'-'z' 'A'-'Z']+ ']'和| table_name_with_brackets as s { TABLENAMEWITHBRACKETS s }。但是,我想知道是否还有其他选择。难道不能让词法分析器和解析器一起工作来确定标记和减少吗?