我想知道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 =匹配。
答案 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规则不发送任何内容。对于解析器来说,这不应该是一个问题,但是如果是这样,您可以轻松地对其进行修复。