【发布时间】:2017-01-16 19:26:56
【问题描述】:
我有以下yacc语法:
%{
#include <stdio.h>
extern FILE* yyin;
extern char* yytext;
%}
%token VAR ID_NAME TYPE_STRING TYPE_BOOL TYPE_NUMBER
%token CONST VALUE_STRING VALUE_BOOL VALUE_NUMBER
%%
program
: declarations
;
declarations
: declaration
| declarations declaration
;
declaration
: var_declaration
| const_declaration
;
value
: VALUE_BOOL
| VALUE_STRING
| VALUE_NUMBER
;
assignment
: ID_NAME '=' value
;
assignments
: assignment
| assignments ',' assignment
;
id_list
: ID_NAME
| id_list ',' ID_NAME
;
declaration_expression
: assignments
| id_list
| assignments ',' declaration_expression
| id_list ',' declaration_expression
;
var_declaration
: VAR ':' type declaration_expression ';' { printf("%s var\n", $1); }
;
const_declaration: CONST ':' type assignments ';' {printf("const\n");}
;
type: TYPE_NUMBER
| TYPE_STRING
| TYPE_BOOL
;
%%
void yyerror (char const *s) {
fprintf (stderr, "%s\n", s);
}
int main(int argc, char** argv[])
{
yyparse();
return 0;
}
它应该描述一种允许以下形式的变量和常量声明的小语言:var:<type> <variables_names or variables_initializations> 和 const:<type> <constants_initialization>。
我想添加对以下语法的支持:
var:<type> var1, var2=<value>, var3;
类似这样的:var:<type> (<variables_names>|<variable_initializations>)+。
为了实现这一点,我在语法中添加了以下修改:
assignments
: assignment
| assignments ',' assignment
;
id_list
: ID_NAME
| id_list ',' ID_NAME
;
declaration_expression
: assignments
| id_list
| assignments ',' declaration_expression
| id_list ',' declaration_expression
;
我认为这将启用 (<variables_names>|<variable_initializations>)+ 部分。但是由于以下几行,我遇到了reduce/reduce 冲突:
| assignments ',' declaration_expression
| id_list ',' declaration_expression
我做错了什么?
【问题讨论】:
-
我认为你的第一个 sn-p 是在非工作修改之后。如果您仍然有工作版本,那将很有帮助。
-
@rici 这是最后一个工作的版本pastebin.com/xb9V3N8G。但是,它只支持以下形式的变量声明:
var:<type> <variables_names> | <initializations>。它不允许将variables_names与initializations混合使用。 -
我认为这就是它的样子,但我不确定。谢谢。不过,为了清楚起见,最好编辑您的问题。 “我使用了 declaration_expression 的定义:”(来自 pastebin),但我想更改它,以便
var声明可以是混合项的列表,可以是 ID 或分配。所以我将其更改为:“(来自当前问题),这给了我减少/减少冲突..