-1

次のコードは、C 言語の字句認識エンジンです。

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

%option yylineno
%option noyywrap
digit ([0-9])
letter ([a-zA-Z])
%%

letter(letter | digit)*             showToken("id");
(digit)(digit)*(.(digit)(digit)*)?      showToken("num");
[(),:;.]                printf("%c",yytext[0]); 
[ \n]
(==|<>|<|<=|>|>=)       showToken("relop");
(+|-)                   showToken("addop");
(*|/)                   showToken("mulop");
(=)                 showToken("assign");
(&&)                    showToken("and");
(||)                    showToken("or");
(!)                 showToken("not");
.                   {   
                    printf("Lexical Error");
                    exit(0);
                    }

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

次のエラーが表示されます。コードが正しく記述されていると思います。コードに多くの変更を加えましたが、コンパイルできません。

~/hedor>lex -t lexical.l > lexical.c
lexical.l:13: unrecognized rule
lexical.l:17: unrecognized rule
lexical.l:17: unrecognized rule
lexical.l:17: unrecognized rule
lexical.l:17: unrecognized rule
lexical.l:17: unrecognized rule
lexical.l:18: unrecognized rule
lexical.l:18: unrecognized rule
lexical.l:18: unrecognized rule
lexical.l:18: unrecognized rule
lexical.l:18: unrecognized rule
lexical.l:21: unrecognized rule
lexical.l:21: unrecognized rule
lexical.l:21: unrecognized rule
lexical.l:21: unrecognized rule
4

1 に答える 1

1

正規表現にはいくつかの問題があります。

行 13、実際にはエラーは 12 にあります。正規表現に空白を追加しないでください。式が壊れて、期待どおりに動作しません。

letter(letter|digit)*             showToken("id");

17 行目、+は特殊文字なので、次のようにエスケープし\ます。

(\+|-)                   showToken("addop");

18行目、文字*と同じ/

(\*|\/)                   showToken("mulop");

21行目、以下と同じ|

(\|\|)                    showToken("or");

digitこれでコンパイル エラーは修正されるはずですが、以下の@JameySharp によるコメントに注意してletterください。{digit}{letter}

于 2012-11-09T16:24:29.710 に答える