yytext相当于ocamllex

时间:2012-12-26 19:20:17

标签: ocaml yacc lex

我的常规(非ocaml)yacc文件中包含以下内容:

wsorword         :  WS 
                    {
                      strcpy($$, yytext);
                    }
                 |  WORD
                    {
                      strcpy($$, yytext);
                    }
                 ;

如何在ocamllex / ocamlyacc中解决由WS或WORD返回的词汇?

2 个答案:

答案 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) }

当然,wsword是其各自令牌的正则表达式。

最后,语法规则变为:

wsorword: 
  WS             { $1 }
| WORD        { $1 }
;