私が知る限り、私が質問する限り、それはあなたと同じように働くべきではないので、あなたは答えたかもしれません。いう。
私はあなたのコードをそのまま使用して、ファイルgrammar.y
とlexer.l
を作成しました。私はコードをコンパイルしました。私はMac OS X 10.11.4、GCC 6.1.0、Bison 2.3(yacc
と偽装)、Flex 2.5.35(lex
と偽装)を使って作業しています。
$ yacc -d grammar.y
$ lex lexer.l
$ gcc -o gl y.tab.c lex.yy.c
$ ./gl <<< 'a'
0
$
続いて2つの変更を行いました。 grammar.y
では、私はにmain()
を変更:
int main(void) {
#if YYDEBUG
yydebug = 1;
#endif
yyparse();
return 0;
}
とlexer.l
に、私はにデフォルトの文字ルールを変更:
a
で後
\n|. yyerror("invalid character");
(.
は改行と一致していないので、改行入力は元の出力にデフォルトでエコーされました。同様のコンパイルを)
、出力は次のようになる。あまりに-DYYDEBUG
を指定コンパイルを
$ ./gl <<< 'a'
0
invalid character
$
:
$ gcc -DYYDEBUG -o gl lex.yy.c y.tab.c
$
出力は、有用なデバッグ情報を含む:
$ ./gl <<< 'a'
Starting parse
Entering state 0
Reading a token: Next token is token AAA()
Shifting token AAA()
Entering state 1
Reducing stack by rule 1 (line 12):
$1 = token AAA()
0
-> $$ = nterm daaaa()
Stack now 0
Entering state 2
Reading a token: invalid character
Now at end of input.
Stack now 0 2
Cleanup: popping nterm daaaa()
$ ./gl <<< 'aa'
Starting parse
Entering state 0
Reading a token: Next token is token AAA()
Shifting token AAA()
Entering state 1
Reducing stack by rule 1 (line 12):
$1 = token AAA()
0
-> $$ = nterm daaaa()
Stack now 0
Entering state 2
Reading a token: Next token is token AAA()
syntax error
Error: popping nterm daaaa()
Stack now 0
Cleanup: discarding lookahead token AAA()
Stack now 0
$
入力に正しく2番目のa
tr構文エラーを引き起こします(文法では許可されていません)。他の文字は許可され、「無効な文字」メッセージが生成され、それ以外の場合は無視されます(./gl <<< 'abc'
はb
の文字メッセージ、c
の文字メッセージ、改行文字のメッセージです)。
lexer.l
にyylval
へ割り当てを変更:
yylval = 'a'; // atoi(yytext);
はASCIIで'a'
の文字コード、ISO 8859-1、ユニコードである97に0から印刷番号、等を変更
私はhere stringをデータソースとして使用しています。入力としてファイルを使用しているにも同様に実現可能になります:
$ echo a > program
$ cat program
a
$ ./gl < a
Starting parse
Entering state 0
Reading a token: Next token is token AAA()
Shifting token AAA()
Entering state 1
Reducing stack by rule 1 (line 12):
$1 = token AAA()
97
-> $$ = nterm daaaa()
Stack now 0
Entering state 2
Reading a token: invalid character
Now at end of input.
Stack now 0 2
Cleanup: popping nterm daaaa()
$
コマンドラインで名前によって指定されたファイルを読みたい場合は、あなたがそれらのファイルを処理するためにmain()
でより多くのコードを記述する必要があります。
あなたの期待を明らかにし、プログラムによってどのように満たされていないのかを知ることができれば助かります。 – rici
文字「a」を「atoi」で整数に変換しようとする目的を説明できますか? –
@ BrianTompsett-湯莱恩yylvalは、デフォルトでintを返し、 "a"でvarを減算することで、入力には以前の入力を覚えていないで26種類のyylval値を得る確実な方法が与えられます。 – Stegosaurus