区分标识符和常用字符串

时间:2013-10-08 13:43:26

标签: parsing bison yacc lex

我想使用Bison/Yacc + Lex编写解析器,它可以解析如下语句:

VARIABLE_ID = 'STRING' 

其中:

ID       [a-zA-Z_][a-zA-Z0-9_]*

STRING      [a-zA-Z0-9_]+

因此,var1 = '123abc'是有效的陈述,而1var = '123abc'则不是。

因此,VARIABLE_IDSTRING,但STRING并不总是VARIABLE_ID

我想知道的是,区分二者的唯一方法是在更高级别编写检查程序(即在Bison代码内)或者是否可以在{{1代码。

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);
       }
       ;