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

问题描述 投票:1回答:2

我的问题是我的规则

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

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

我已经更新了自制软件和flex。我正在使用“flex example.flex”进行编译,并尝试使用“./a.out file.txt”执行

我的规则:

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();
}
c flex-lexer lex
2个回答
1
投票

作为一个起点:“{”“}”没有被正确使用 - 它应该是

  • {id}扩展用户级id
  • REGEXP{number}REXEXP{number,number}用于数字量化

你写的时候:

CAR {"_"|"$"}

它应该是CAR ("_"|"$")CAR [_$]

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

应该:

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

0
投票

第一个是因为:

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

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

{LETRA}(({LETRA}|{DIG}){3,})({LETRA}|{DIG}*) {
© www.soinside.com 2019 - 2024. All rights reserved.