0

ここに字句解析器を書いています。コードは次のとおりです。

%{
#include <stdio.h>
void showToken(char*);
%}

%%
int main(){
void showToken(char* name){
        printf("<%s,%s>",name,yytext);
}
return 0;
}
%%

私は以下を取得しています:

~/hedor1>cc -c -o lexical.o lexical.c
lexical.l:40: error: expected identifier or â(â before â%â token

どこに問題があるのか​​ わかりません。さらに、コードセクションに次のように書く必要があります。

int main(){}

上記のメイン関数を書かないとどうなりますか?

4

1 に答える 1

0

主な問題

%%Lex (Flex) アナライザーでは 2 行しか使用できません。

...definitions...
%%
...lexical patterns...
%%
...everything else...

プログラム Lex と Flex は、2 番目の%%verbatim の後のファイルの内容を、生成された C コードに単純にコピーします。そして、Cは%%いつでも好きではありません。

ニトピック

次のように、関数を互いに入れ子にしないでください。

int main(){
void showToken(char* name){
        printf("<%s,%s>",name,yytext);
}
return 0;
}

main()から分離する必要がありますshowToken()。(ネストされた関数を許可する GCC 固有の拡張機能があります。使用しないでください。)


また、エラー メッセージに行番号がある場合は、ソース内の行を識別するコメントを挿入すると便利です。または、識別された行を記述します。しかし、エラーが 1 行目にあったとしても、コードの行数を数える必要はありません...まあ、1 ~ 3 行目はそれほど重要ではないかもしれませんが、ファジー ブレークポイントがあり、その後で行を特定する必要があります。重要。十代になる頃には、それは不可欠に近づいています。最初の 5 行はおそらく重要ではありません。(6-12) の間では、通常、行番号を示す方が適切です。

于 2012-11-10T15:36:57.027 に答える