我正在 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 }
。但是,我想知道是否还有其他选择。难道不能让词法分析器和解析器一起工作来确定标记和减少吗?