1

通常の (ocaml ではない) yacc ファイルには次のものがあります。

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

ocamllex/ocamlyacc で WS または WORD によって返される語彙素に対処するにはどうすればよいですか?

4

2 に答える 2

3

OK、あなたの 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 に答える