我想使用Bison/Yacc
+ Lex
编写解析器,它可以解析如下语句:
VARIABLE_ID = 'STRING'
其中:
ID [a-zA-Z_][a-zA-Z0-9_]*
和
STRING [a-zA-Z0-9_]+
因此,var1 = '123abc'
是有效的陈述,而1var = '123abc'
则不是。
因此,VARIABLE_ID
是STRING
,但STRING
并不总是VARIABLE_ID
。
我想知道的是,区分二者的唯一方法是在更高级别编写检查程序(即在Bison
代码内)或者是否可以在{{1代码。
答案 0 :(得分:2)
您的抽象语句语法实际上是:
VARIABLE = STRING
而不是
VARIABLE = 'STRING'
因为引号分隔符是我们通常希望不在语法之外的词法细节。所以,令牌模式实际上是这样的:
ID [a-zA-Z_][a-zA-Z0-9_]*
STRING '[a-zA-Z_0-9]*'
ID
是一个字母或下划线,后跟任意组合(包括空)的字母,数字和下划线。
STRING
是单引号,后跟一个序列(可能为空)字母,数字和下划线,后跟另一个单引号。
因此,您所关注的模棱两可不存在。 ID
实际上不是STRING
,反之亦然。
在您的Bison解析器内部或可能在词法分析器中的某个位置,您可能希望按下yytext
匹配的STRING
以删除引号,并将文本保留在它们之间作为字符串。这可能是一个野牛规则,可能类似于:
string : STRING
{
$$ = strip_quotes($1);
}
;