0

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

VARIABLE_ID = 'STRING' 

在哪里:

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

和:

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

所以,var1 = '123abc'是一个有效的陈述,而1var = '123abc'不是。

因此, aVARIABLE_ID是 aSTRING但 aSTRING并不总是 a VARIABLE_ID

我想知道的是,区分两者的唯一方法是在更高级别(即内部Bison代码)编写一个检查过程,或者我是否可以在Lex代码中解决它。

4

1 回答 1

2

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

VARIABLE = STRING

并不是

VARIABLE = 'STRING'

因为引号分隔符是我们通常希望避开语法的词汇细节。因此,令牌模式实际上是这样的:

ID       [a-zA-Z_][a-zA-Z0-9_]*
STRING   '[a-zA-Z_0-9]*'

AnID是一个字母或下划线,后跟字母、数字和下划线的任意组合(包括空)。

ASTRING是一个单引号,后跟一个序列(可能为空)字母、数字和下划线,然后是另一个单引号。

所以你关心的歧义是不存在的。AnID实际上不是 a STRING,反之亦然。

在 Bison 解析器中的某个地方,或者可能在词法分析器中,您可能想要按摩匹配yytextSTRING以删除引号并将它们之间的文本保留为字符串。这可能是 Bison 规则,可能类似于:

string : STRING 
       {
          $$ = strip_quotes($1);
       }
       ;
于 2013-10-10T06:42:19.963 回答