我的常规(非ocaml) yacc文件中包含以下内容:
wsorword : WS
{
strcpy($$, yytext);
}
| WORD
{
strcpy($$, yytext);
}
;如何处理ocamllex/ocamlyacc中WS或WORD返回的词位?
发布于 2012-12-27 04:05:26
我会在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 }
;发布于 2012-12-27 03:48:13
好的,您的yacc代码使用了lex提供的全局变量。OCaml不禁止全局变量,但它们与编写代码的函数式方式不一致。如果您将词法缓冲区全局化为!lexbufr (比方说),手册上说您可以通过调用Lexing.lexeme !lexbufr来获取最新的词位。请注意,我自己还没有尝试过这个。
https://stackoverflow.com/questions/14045154
复制相似问题