LEX中的正则表达式是什么,以匹配不是以换行符开头的字符串

时间:2018-12-28 19:38:40

标签: regex lex

我想知道lex中的正则表达式以匹配不匹配的字符串(开始该行,后跟可选的空格,后跟“ a =“)。我正在尝试使用以下类型的行来解析语言:

     a=some value
     b=some value

字符串“ a =”(b =,等等)之前可以带空格,然后在=和换行符之后的另一个字符串后不能带空格。例如:

     a=123 abcde

此处为“ 123 abcde”。 问题是,至少在理论上,我可能会遇到以下问题

     a=123 a= 

或更糟的是:

     a=a=

第一个a =是键,第二个a =现在是值的一部分,而不是key属性。如何区分第一个和第二个令牌?

我可以将键“ a =”与以下内容进行匹配,以处理前导空白:

    ^[ \r\t]*"a="  

但是如何匹配第二个字符串?我需要一个类型匹配的正则表达式,该字符串不匹配(起始行,后跟可选的空格,后跟a =)并扩展到换行符。主要技巧是避免表达式也与属性a =匹配。

1 个答案:

答案 0 :(得分:2)

使用开始条件为=之后的输入创建不同的词法上下文。

Lex与不依赖于上下文的令牌化语言(大多数编程语言但很少有特殊交换格式)一起使用时效果最佳。但是,如果您没有太多的背景需要处理,那么启动条件是可以控制的。

有关详细信息和示例,请参见the manual

简单的例子:

%x RHS
%%
[[:space:]]+  ; /* Ignore leading white space and blank lines */
a=            { BEGIN(RHS); return TOKEN_A; }
b=            { BEGIN(RHS); return TOKEN_B; }
.*            ; /* Ignore other input. Should do something else */
<RHS>.+       { yylval = strdup(yytext); return VALUE; }
<RHS>\n       { BEGIN(INITIAL); }

注意:如果没有值,则RHS规则不发送任何内容。对于解析器来说,这不应该是一个问题,但是如果是这样,您可以轻松地对其进行修复。