2

非常に単純な yacc/lex プログラムに問題があります。基本的な手順をいくつか忘れている可能性があります (これらのツールを使用してから長い時間が経ちました)。

私の lex プログラムでは、次のようないくつかの基本的な値を指定します。

word    [a-zA-Z][a-zA-Z]*
%%
":"    return(PV);
{word}  { 
            yylval = yytext;
            printf("yylval = %s\n",yylval);
            return(WORD);
       }
"\n"    return(ENDLINE);

私の yacc プログラムでは、文法の始まりは次のとおりです (TranslationUnit は %start です)。

TranslationUnit:
               /* Nothing */
              | InfoBlock Data
              ;

InfoBlock:
           /* Nothing */
         | InfoBlock InfoExpression {}
         ;

InfoExpression:
             WORD PV WORD ENDLINE { printf("$1 = %s\n",$1);
 printf("$2 = %s\n",$2);
 printf("$3 = %s\n",$3);
 printf("$4 = %s\n",$4);
                                  }
            | ... /* other things */
            ;

Data:
    ... /* other things */

入力を使用してプログラムを実行すると:

keyword : value

私は少なくとも得ると思った:

$1 = keyword
$2 = keyword // yylval not changed for token PV
$3 = value
$4 = value // yylval not changed for token ENDLINE

実際に私は得る:

$1 = keyword : value
$2 = keyword : value
$3 = value
$4 = value

この結果はわかりません。少し前に文法を勉強したことがありますが、今はすべてを覚えていなくても、重要な間違いは見当たりません...

よろしくお願いします。

4

1 に答える 1

3

問題は、トークンを保存しない限り、Lex/Yacc がスペースを上書きしたり、別のスペースを指したりし続けることです。したがって、変更される前に重要な情報を隠しておく必要があります。Lex コードの出力はyylval、レクサー (字句解析器) が呼び出された時点で値が正確であることを示しているはずです。

同じ基本的な問題が発生して診断されたSO 2696470も参照してください。

于 2010-07-27T14:17:47.153 に答える