2012-03-17 11 views
0

こんにちは私はLEXをできるようにしようとしている/ yaccの分割テーブル、subwayLinesのトークンにこの文字列LEX/yaccの文字列(構文エラー)を認識しません

table subwayLines:int[3] 

、INT [3]と[ 3]オプション(つまり、intまたはint型[3])私は「INT」を認識しようとするまで

すべてがうまくある、 ので、これは私がlexの

[A-Za-z0-9\[\]]+ { /* column property*/ 
        yylval.sval = (char *)strdup(yytext); 
      char* temp=yylval.sval; 
      return STRING; 
       } 

に何をしたかである私は、問題がある知っていますin

[A-Za-z0-9\[\]]+ 

ので、私はそれは私が私の文字列でこれを書いた場合、例えば、「[」や「]」なしで行くことができない、まだ私を除いて動作します

[A-Za-z]+("[")?+[0-9]+("]")?+(",")? 

にそれを変更する場合:

table subwayLines:int 

それは私に構文エラー を与えるので、誰もそれを変更する方法を知っていますか? [3]をオプションにするには感謝

+0

'int型を認識するが理由である[3 ] 'を文字列トークンとして返すのではなく、そのトークンを4つのトークンとして返して構文を解析するのではなく、空白がある場合はどうなりますか(それは許されますか?) 'int [3]'。 – Kaz

答えて

1

、これは動作しません。

[A-Za-z]+("[")?+[0-9]+("]")?+(",")? 

あなただけの角括弧はオプションになりますが、その間の数ではありませんしました。あなたは次のようなものが必要です

[A-Za-z]+("["[0-9]+"]")? 

四角で囲まれた部分全体がオプションです。

また、(REGEX)?+の組み合わせはあまり意味がありません(?+部分)。 (REGEX)が0回以上のような1回以上オプションであると効果的に言っているので、(REGEX)*と同等です。

(2番目の例では、オプションのカンマを持っている理由わからない;。最初のものはコンマを認識しないと、それはあなたの例の入力に示されていない)

関連する問題