%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;
。
答案 0 :(得分:1)
确保词法分析器在看到一个空心括号时返回'['
。
混合像'['
这样的单引号令牌和COLON
之类的令牌令人困惑,并建议您从不同的来源进行复制和粘贴,而不是实际设计程序。由于词法分析器和解析器必须就令牌的处理达成一致,因此这种创建程序的形式容易出错。我建议在整个过程中使用单引号单字符标记,因为它更易读并简化了词法分析器。
关于X2
,'['
和"["
之间存在差异。你可能想要第一个。 stmt2
中也存在同样的问题,它使用"("
和")"
代替单引号版本。