数组声明语法错误

时间:2017-04-07 12:47:50

标签: yacc

%token DIGIT RETURN IDENTIFIER COLON COMMA ELSE IF NL KEYWORD BR READ  WRITE WHILE EQUAL
%start y2
%left '-'
%left '+'
%right '='
%%
stmt1:KEYWORD IDENTIFIER X1 //for initialization.
;
y2:stmt1 stmt2 //y2 is starting variable
|
;
X1:COLON {printf(" for int a/ char a");} 
|'['DIGIT']'COLON {printf("for array declarations");} 
;
stmt2:KEYWORD IDENTIFIER"("stmt3")"stmt5 {printf("for functions");} 
|
;
stmt3:KEYWORD IDENTIFIER X2 
| 
;
X2:stmt4 {printf("for parameter int/char");} 
|"["DIGIT"]"COLON {printf("for parameter int arr[]/char arr[]");} //in this production parser is not responding
;
stmt4:COMMA stmt3 {printf("to have multiple arguments");} 
|
;
%%

我正在解析字符串int a[10];  但它不是解析,而是 每次都执行yyerror()。 此代码也解析int a;单个语句char a;

1 个答案:

答案 0 :(得分:1)

确保词法分析器在看到一个空心括号时返回'['

混合像'['这样的单引号令牌和COLON之类的令牌令人困惑,并建议您从不同的来源进行复制和粘贴,而不是实际设计程序。由于词法分析器和解析器必须就令牌的处理达成一致,因此这种创建程序的形式容易出错。我建议在整个过程中使用单引号单字符标记,因为它更易读并简化了词法分析器。

关于X2'['"["之间存在差异。你可能想要第一个。 stmt2中也存在同样的问题,它使用"("")"代替单引号版本。