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