4

引用符なしで引用符付きの文字列をキャプチャしようとしています。私はこの端末を持っています

%token <string> STRING

そしてこのプロダクション

constant:
    | QUOTE STRING QUOTE { String($2) }

これらのレクサー規則とともに

| '\''       { QUOTE }
| [^ '\'']*  { STRING (lexeme lexbuf) } //final regex before eof

a に至るまでのすべてを、QUOTE解析しない単一の語彙素として解釈しているようです。したがって、私の問題は文法のどこかにあるのかもしれません-よくわかりません. 私はこれを正しい方法で行っていますか?文字列から引用符を除外しようとする前は、問題なく解析されていました。

アップデート

次のレクサー規則にはあいまいさがあると思います

let name = alpha (alpha | digit | '_')*
let identifier = name ('.' name)*

次のルールは、STRING

| identifier    { ID (lexeme lexbuf) }

STRING正規表現に引用符を含めずにこれらを明確にする方法はありますか?

4

3 に答える 3

5

文字列や数値リテラルなどの定数に対して字句解析器で意味解析を行うのはごく普通のことです。

| '\'' [^ '\'']* '\'' 
    { STRING (let s = lexeme lexbuf in s.Substring(1, s.Length - 2)) }
于 2011-11-21T21:33:39.777 に答える
1

語彙素を引用符で使用できますが、パーサーで引用符をトリムします

レクサー:

let constant       = ("'" ([^ '\''])* "'")
...
| constant         { STRING(lexeme lexbuf) } 

パーサー:

%token <string> STRING

...
constant:
    | STRING { ($1).Trim([|'''|]) }

または、文字列から引用符を抽出する場合:

レクサー:

let name = alpha (alpha | digit | '_')*
let identifier = name ('.' name)*
...

| '\''       { QUOTE }
| identifier { ID (lexeme lexbuf) }
| _          { STRING (lexeme lexbuf) } 

identifierは STRING からシンボルを取り除くため、語彙素ストリームは次のようになります: QUOTE ID STRING ID .. QUOTE、パーサーでこれを処理する必要があります。

パーサー:

constant:
     | QUOTE content QUOTE     { String($2) }

content:
     | ID content      { $1+$2 }
     | STRING content  { $1+$2 }
     | ID              { $1 }
     | STRING          { $1 }
于 2011-11-21T19:21:28.830 に答える
0

同様の問題がありました。状態を使用して「lexic.l」ファイルにそれらをキャプチャします。 ここで私の自動応答

于 2014-01-10T10:42:05.753 に答える