Bison 如何区分标识符和字符串?

Bison 如何区分标识符和字符串?,bison,lex,Bison,Lex,我有一个,但有一点不同。我想分析下面的模式: ID = STRING 注意字符串没有引号。ID和字符串之间的区别是ID只能以字符和下划线开头,字符串没有这样的约束。区分标识符和字符串、flex或bison的最佳位置在哪里?在flex中,如果输入匹配两种模式,则首选第一种模式。因此,您可以编写,例如: [[:alpha:]]_[[:alnum:]_]+ { yylval = strdup(yytext); return ID; } [[:alnum:]_]+ {

我有一个,但有一点不同。我想分析下面的模式:

ID = STRING

注意字符串没有引号。ID和字符串之间的区别是ID只能以字符和下划线开头,字符串没有这样的约束。区分标识符和字符串、flex或bison的最佳位置在哪里?

在flex中,如果输入匹配两种模式,则首选第一种模式。因此,您可以编写,例如:

[[:alpha:]]_[[:alnum:]_]+   { yylval = strdup(yytext); return ID; }
[[:alnum:]_]+               { yylval = strdup(yytext); return STRING; }

第一条规则将针对
a_97
(两种模式匹配)等输入执行,而第二条规则将针对
97_a
(第一种模式不匹配)等输入执行。

a_97=a_97
为例。问题是,我将获得令牌序列:ID,'=',ID,这是语法规则
ID=STRING
不可接受的。我决定把它们当作绳子,把支票留给野牛

这是flex的工作,你让自己的生活变得困难。字符串通常使用引号是有原因的;它使生活更容易。如果
a_97=a_97
需要将第一个视为ID,第二个视为字符串,则必须使用语法分析器的语义反馈进行上下文敏感词法分析。您可以改为允许
STRING=STRING
,并强制执行语义检查,以确保LHS上的字符串应该是一个ID;这应该会让生活变得更轻松一些(但要注意模棱两可的语法)。您可能希望创建一个规则:
id:STRING
,该规则检查字符串是否为有效标识符,并使用
id=STRING