LoginSignup
1

More than 5 years have passed since last update.

yacc/lexで詰まったこと

Last updated at Posted at 2018-10-26

詰まったこと

readlineをincludeしようと思ったが,

Undefined symbols for architecture x86_64:
  "_readline", referenced from:
      _my_yyinput in lex-bb826e.o
ld: symbol(s) not found for architecture x86_64

というようなエラーが出た.

解決策

コンパイル時にライブラリをリンクしてあげる必要があったようだ.
-lreadlineオプションをつければ大丈夫!

詰まったこと

readlineを使って文字列の読み込みを可能にしようとしたが,どうもうまくいかない..
具体的には

>>1+1
1+1
>>fdsawf
fdsawf
>>fda
fda
>>1+1
1+1
syntax error

みたいなエラーが...

色々試したところ,どうやら改行記号が読めていなかったようだと結論.
構文規則を変更することに...

解決策

とりあえず,改行はreadlineでは読めないようなので,改行を消して実行しようとした.
しかし,一向に正常化しない.

ここでかなり詰まってしまったが,ただ終端記号として働くものがなく,構文解析器が動作していないだけであった...自分の中では,まずlex側で処理されてyaccに運ばれるというイメージが強く,まずlex側で引っかかるよなあと思っていたが,ダメで,実際は協調的に働くようだ.
具体的には,字句解析器で字句解析がまず行われるが,確定ではなく,終端記号まで登場して確定したところで,処理を始める,という認識が一番良さそう(要確認).
以下のようなコードでDEBUGしようとしていて,もし数字が入っていたら構文解析器の結果にかかわらずここの関数は実行されると思っていたが,どうやらそれが大きな間違いだったようだ.
ここでかなり時間を使ってしまった,,,

<INITIAL>[1-9][0-9]* {
    Tag *tag = malloc(sizeof(Tag)); 
    tag->type = INT_TYPE;
    sscanf(yytext,"%d",&tag->val.i);
    yylval.tag = tag;
    fprintf(stderr, "a number was read.\n",
    return INT_LITERAL;
}

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1