Parsing 区分标识符和公共字符串

Parsing 区分标识符和公共字符串,parsing,bison,yacc,lex,Parsing,Bison,Yacc,Lex,我想使用Bison/Yacc+Lex编写一个解析器,它可以解析如下语句: VARIABLE_ID = 'STRING' 其中: ID [a-zA-Z_][a-zA-Z0-9_]* 以及: 因此,var1='123abc'是有效的语句,而1var='123abc'不是 因此,变量ID是字符串,但字符串并不总是变量ID 我想知道的是,区分这两者的唯一方法是在更高的层次上编写一个检查过程(即在Bisoncode内部),还是我可以在Lexcode中计算出来。您的抽象语句语法实际上是:

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

VARIABLE_ID = 'STRING' 
其中:

ID       [a-zA-Z_][a-zA-Z0-9_]*
以及:

因此,
var1='123abc'
是有效的语句,而
1var='123abc'
不是

因此,
变量ID
字符串
,但
字符串
并不总是
变量ID


我想知道的是,区分这两者的唯一方法是在更高的层次上编写一个检查过程(即在
Bison
code内部),还是我可以在
Lex
code中计算出来。

您的抽象语句语法实际上是:

VARIABLE = STRING
而不是

VARIABLE = 'STRING'
因为引号分隔符是一个词法细节,我们通常希望将其排除在语法之外。因此,令牌模式实际上是这样的:

ID       [a-zA-Z_][a-zA-Z0-9_]*
STRING   '[a-zA-Z_0-9]*'
ID
是字母或下划线,后跟字母、数字和下划线的任意组合(包括空)

字符串
是一个单引号,后跟一个序列(可能是空的)字母、数字和下划线,后跟另一个单引号

所以你所关心的模糊性并不存在。
ID
实际上不是
字符串,反之亦然

在Bison解析器中的某个地方,或者可能在lexer中,您可能希望对
字符串的
yytext
匹配进行按摩,以删除引号,并将它们之间的文本作为字符串保留。这可能是野牛规则,可能类似于:

string : STRING 
       {
          $$ = strip_quotes($1);
       }
       ;

你的字符串不是像你写的那样总是用单引号括起来吗?
string : STRING 
       {
          $$ = strip_quotes($1);
       }
       ;