1

次のレクサールールがあります。

let ws = [' ' '\t' '\n']+
... 
| ws                  {Printf.printf "%s" (Lexing.lexeme lexbuf); WS(Lexing.lexeme lexbuf)}

そして、次のパーサー規則:

%token <string>  WORD WS 
cs               :  LSQRB wsornon choices wsornon RSQRB {$2}
                 ;

wsornon          : /* nothing */
                 | WS {$1}
                 ;

choices          :  choice {$1}
                 |  choices choice {$2}
                 ;

choice           :  CHOICE LCURLYB mainbody RCURLYB {$3}
                 ;

wsornon私は基本的に、空白または何も一致させたいと思っています。ただしcs、空白がない場合 (空のルールに対応) には構文エラーが発生します。

何か不足していますか?

4

1 に答える 1

4

空のストリームを解析しても、プロダクション ルールが必要です。

wsornon:
  |    { something for nothing }
  | WS { something for whitespace }

menhirには、この種のものに適したパラメーター化されたルールがあることに注意してください。そのOPTIONため、そのために別のルールを作成する必要はありません。実際には、 ruleが type の何かを返す場合OPTION(foo)は type の生成を返しますが、いずれにせよそれらを無視するので、状況は少し異なります。bar optionfoobar

空白を無視したい場合は、字句解析ステップで空白を完全に削除してみませんか? あなたの文法のどこかで役に立ちますか?レクサーを少しハックして、文法全体を汚染するよりも、重要であることがわかっているいくつかのトークンの直後に空白トークンを配置したいと思います。もちろん、menhir はそれを助けるパラメータ化されたルールを定義することを可能にします (以下の未テストの例):

ws(rule):
| LIST(WS) result = rule LIST(WS) { result }
于 2012-12-28T21:34:27.707 に答える