我正在尝试使用FLEX和BISON解析遗留语言(类似于'C')。除了匹配字符串外,一切都很顺利。
这种相当奇怪的遗留语言不支持在字符串文字中引用字符,因此以下都是有效的字符串文字:
"hello"
""
"\"
我正在使用以下规则来匹配字符串文字:
\".*\" { yylval.strval = _strdup( yytext ); return LIT_STRING; }
不幸的是,这是一个贪婪的匹配,所以它匹配如下代码:
"hello", "world"
作为单个字符串(hello", "world
)。
通常的非贪婪量词.*?
似乎不适用于FLEX。有什么想法吗?
答案 0 :(得分:12)
只是禁止在引号之间加引号。
\"[^"]*\"
答案 1 :(得分:4)
反斜杠转义引号
以下内容也允许:
\"(\\.|[^\n"\\])*\" {
fprintf( yyout, "STRING: %s\n", yytext );
}
并且不允许在字符串常量中使用换行符。
E.g:
>>> "a\"b""c\d"""
STRING: "a\"b"
STRING: "c\d"
STRING: ""
并失败:
>>> "\"
在实现类似C的功能时,请务必查找现有的Lex实现,例如:http://www.lysator.liu.se/c/ANSI-C-grammar-l.html