需要Lex正则表达式将字符串匹配到换行符

时间:2018-12-27 16:19:44

标签: flex-lexer yacc lex

我想解析以下类型的字符串:

ll = LinkedList()
ll.AddMusicToTheFront(music(1, "Lauv", "Chasing Fire"))
ll.AddMusicToTheFront(music(2, "Panic! At The Disco", "High Hopes"))
ll.AddMusicToTheFront(music(3, "Bishop Briggs", "River"))
ll.AddMusicAtPosition(music(4,"Why Don't We", "Hooked"),2)

for i in range (0,ll.len_link()):
    music.printlist()

'='周围没有空格,值一直扩展到换行符。可能会有前导空格。

我的lex规范(相关部分)是:

a=some value
b=some other value

我尝试了%% a= { printf("Found attr %s\n", yytext); return aATTR; } ^[ \r\t]+ { printf("Found space at the start %s\n", yytext); } ([^a-z]=).*$ { printf("Found value %s\n", yytext); } \n { return NEWLINE; } %% 和其他一些正则表达式,但无济于事。 这看起来很简单。有什么建议么?我还知道lex返回最长的匹配项,这使它进一步复杂化。我得到了与我尝试过的某些正则表达式匹配的整个行。

1 个答案:

答案 0 :(得分:1)

您可能希望合并单独的开始状态。这些允许您对简单的上下文进行编码。下面的简单示例捕获了每次调用yylex()的ID,运算符和值。

%{
char id;
char op;
char *value;
%}

%x VAL OP
%%
<INITIAL>[a-z]+ {
    id = yytext[0];
    yyleng = 0;
    BEGIN OP;
}
<INITIAL,OP>[ \t]*
<OP>=[ \t]* {
    op = yytext[0];
    yyleng = 0;
    BEGIN VAL;
}
<VAL>.*\n {
    value = yytext;
    BEGIN INITIAL;
    return 1;
}
%%