为什么我的弹性代码中存在无法识别的规则?

时间:2017-12-17 16:39:45

标签: c flex-lexer lex

我的问题是我的规则

此代码必须检测此格式的文件中的URL:

ftp://[<user>[:<password>]@]<host>[:<port>]/<path>[;<ftptype>]

我已经更新了自制软件和flex。我正在使用&#34; flex example.flex&#34;编译,并尝试使用&#34; ./ a.out file.txt&#34;

执行

我的规则:

LETRA [A-Za-z]
DIG [0-9]
CAR {"_"|"$"}
IDENT {LETRA|"$"|"_"}({LETRA|DIG|"_"|"$"|"-"}*)

%%
{LETRA}({LETRA|DIG}{3,})({LETRA}|{DIG}*) {
                                          printf("(<user>,%s)",yytext);
                                         }
{LETRA}{CAR}({LETRA|DIG|CAR}{4,})({LETRA|DIG|CAR}*)|
{LETRA}{LETRA|DIG}{CAR}({LETRA|DIG|CAR}{3,})|
{LETRA}({LETRA|DIG}{2}){CAR}{LETRA|DIG|CAR}{2,}|
{LETRA}({LETRA|DIG}{3}){CAR}({LETRA|DIG|CAR}+)|
{LETRA}({LETRA|DIG}{4}){CAR}({LETRA|DIG|CAR}*)|
{LETRA}({LETRA|DIG}{5}){CAR}({LETRA|DIG|CAR}*)  {printf("(<password>,%s)",yytext);}
({IDENT[.]}+{IDENT})+ {
                        printf("(<host>,%s)",yytext);
                      }
{DIG}({DIG})* {
                printf("(<port>,%s)",yytext);
              }
({IDENT[/]}+{IDENT})+ {
                       printf("(<path>,%s)",yytext);
                      }
{[#]DIG}({DIG})* {
                  printf("(<ftptype>,%s)",yytext);
                 }
. {printf("%s",yytext);}
%%


int main(){
   yylex();
}

2 个答案:

答案 0 :(得分:1)

作为一个起点:&#34; {&#34; &#34;}&#34;没有正确使用 - 它应该是

  • {id}展开用户类id
  • REGEXP{number}REXEXP{number,number}进行数字量化

当你写道:

CAR {"_"|"$"}

应为CAR ("_"|"$")CAR [_$]

IDENT {LETRA|"$"|"_"}({LETRA|DIG|"_"|"$"|"-"}*)

应该是:

IDENT ({LETRA}|"$"|"_")({LETRA}|{DIG}|"_"|"$"|"-")*

答案 1 :(得分:0)

第一个是因为:

{LETRA}({LETRA|DIG}{3,})({LETRA}|{DIG}*) {

你不能将用户类(不确定这是否是官方名称)与|组合,它必须是:

{LETRA}(({LETRA}|{DIG}){3,})({LETRA}|{DIG}*) {