1

我的常规(不是 ocaml)yacc 文件中有以下内容:

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

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

4

2 回答 2

3

好的,您的 yacc 代码正在使用 lex 提供的全局变量。OCaml 不禁止全局变量,但它们与编写代码的函数式方式不一致。如果你将你的词法缓冲区设置为全局名称!lexbufr(比如),手册说你可以通过调用Lexing.lexeme !lexbufr. 请注意,我自己没有尝试过。

于 2012-12-26T19:48:12.527 回答
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 }
;
于 2012-12-26T20:05:25.503 回答