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

What is the regular expression in LEX to match a string NOT starting with newline

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

     a=some value
     b=some value

字符串 "a="(b= 等)前面可以有空格,后面可以跟另一个字符串,在 = 和换行符之后没有任何空格。例如:

     a=123 abcde

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

     a=123 a= 

或更糟:

     a=a=

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

我可以将键 "a=" 与以下处理前导空格的键匹配:

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

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

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

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 规则将不发送任何内容。这对解析器来说应该不是问题,但如果是,您可以相当轻松地修复它。