我的常规(非ocaml)yacc文件中包含以下内容:
wsorword : WS
{
strcpy($$, yytext);
}
| WORD
{
strcpy($$, yytext);
}
;
如何在ocamllex / ocamlyacc中解决由WS或WORD返回的词汇?
答案 0 :(得分:3)
好的,您的yacc代码正在使用lex提供的全局变量。 OCaml不禁止全局变量,但它们与编写代码的功能方式不一致。如果您将词汇缓冲区全局设置为名称!lexbufr
(例如),则说明您可以通过调用Lexing.lexeme !lexbufr
来获取最新的词汇。请注意,我自己没有尝试过这个。
答案 1 :(得分:2)
我会在mly
文件中将我的标记定义为:
%token<string> WORD WS
在mll
文件中,我将使用以下操作:
rule lexer = parse
| ws { WS (Lexing.lexeme lexbuf) }
| word { WORD (Lexing.lexeme lexbuf) }
当然,ws
和word
是其各自令牌的正则表达式。
最后,语法规则变为:
wsorword:
WS { $1 }
| WORD { $1 }
;