2017-12-17 6 views
2

私はミニ言語用の字句解析ツールを作ろうとしています。ルールの1つは、識別子が数字で始めることができないという事実を指しています。 数字と識別子を定義する正規表現は次のとおりです。名前付け識別子のエラーを特定するためにFlexが機能しない

NUMBER [+-]?[0-9]+ 
ID [a-zA-Z][a-zA-Z0-9_]* 

と.lxiファイルで定義されたルール:

%% 
{DELIMITATOR} printf("Delimitator: %s\n",yytext); 
{NUMBER} printf("Number: %s\n",yytext); 
{ID} printf("Identifier: %s\n",yytext); 
. printf("Error: %s\n",yytext); 
%% 

問題は、入力ファイルには、識別子の命名規則を尊重しないトークンが存在する場合に表示されます。

Number: 1; 
Identifier: abc; 

代わりに、私はエラーメッセージを受け取りたい:例えば、

a := 1abc 

のために私は次のような結果を得ます。私ができることはありますか?私はまた、数字を定義するときに後続のコンテキストを使用しようとしましたが、うまくいかないようです。

+0

できません。 Flexは、存在するトークンを正しく識別しており、それがそのためのものです。あなたは違法なトークンのルールを書くことはできませんし、あなたはしたくありません。 – EJP

答えて

0

質問に表示されるエラーは、構文レベル(bison、yaccなど)で検出、処理、報告されます。

しかし、1abcのようなエラーがよく見られる場合は、 フレックス固有のルールを書いて報告することができます。例:

[0-9][a-zA-Z_]+ fprintf(stderr, "invalid identifier '%s'\n",yytext); 
[a-zA-Z]{40,}  fprintf(stderr, "identifier to long '%s'\n",yytext); 
関連する問題