- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在编写基本的编译器,但很早就卡住了。当我尝试运行我的 bison 文件时,它会抛出错误(在下面)我不知道为什么会这样,并且已经为此苦苦挣扎了很长一段时间。
错误:
compiler/parser.y: warning: 9 nonterminals useless in grammar [-Wother]
compiler/parser.y: warning: 32 rules useless in grammar [-Wother]
compiler/parser.y:34.1-7: fatal error: start symbol program does not derive any sentence
program : DECLARE declaration IN commands END
弹性:
%option noyywrap
%{
#include <stdio.h>
#include "parser.tab.h"
%}
NUMBER [0-9]+
PID [_a-z]+
WHITESPACE [ \t\r]+
%x COMMENT
%%
<INITIAL>{
"[" BEGIN(COMMENT);
\n yylineno++;
{WHITESPACE}
{NUMBER} {
printf("Number: %s\n", yytext);
yylval.ival = (char*) strdup(yytext);
return NUM;
}
{PID} {
printf("PID: %s\n", yytext);
yylval.sval = (char*) strdup(yytext);
return PID;
}
":=" return ASSIGN;
"+" return ADD;
"-" return SUB;
"*" return MUL;
"/" return DIV;
"%" return MOD;
"=" return EQ;
"!=" return NEQ;
"<" return LT;
">" return GT;
"<=" return LE;
">=" return GE;
")" return R_BRACKET;
"(" return L_BRACKET;
";" return SEMICOLON;
":" return COLON;
"DECLARE" return DECLARE;
"IN" return IN;
"END" return END;
"IF" return IF;
"ELSE" return ELSE;
"ENDIF" return ENDIF;
"WHILE" return WHILE;
"DO" return DO;
"ENDWHILE" return ENDWHILE;
"ENDDO" return ENDDO;
"FOR" return FOR;
"FROM" return FROM;
"TO" return TO;
"DOWNTO" return DOWNTO;
"ENDFOR" return ENDFOR;
"READ" return READ;
"WRITE" return WRITE;
}
<COMMENT>{
"]" BEGIN(INITIAL);
[^\n]+\n yylineno++;
}
%%
Bison :
%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern int yylineno;
int yylex(void);
void yyerror(const char *);
int error = 0;
%}
%union{
char* sval;
char* ival;
}
%token <sval> DECLARE /* Declarations block */
%token <sval> IN END /* Code block */
%token <sval> IF THEN ELSE ENDIF /* Conditional block */
%token <sval> WHILE DO ENDWHILE ENDDO /* While-do and Do-while loop block */
%token <sval> FOR FROM TO DOWNTO ENDFOR /* For loop block */
%token <sval> READ WRITE
%token <sval> ASSIGN
%token <sval> ADD SUB MUL DIV MOD /* Arithmetic operators */
%token <sval> EQ NEQ LT GT LE GE /* Boolean operators */
%token <sval> L_BRACKET R_BRACKET SEMICOLON COLON /* Symbols */
%token <ival> NUM
%token <sval> PID
%%
program : DECLARE declaration IN commands END
;
declaration : declaration PID SEMICOLON
| declaration PID L_BRACKET NUM COLON NUM R_BRACKET SEMICOLON
;
commands : commands command
| command
;
command : id ASSIGN expression SEMICOLON
| IF condition THEN commands ELSE commands ENDIF
| IF condition THEN commands ENDIF
| WHILE condition DO commands ENDWHILE
| DO commands WHILE condition ENDDO
| FOR PID FROM value TO value DO commands ENDFOR
| FOR PID FROM value DOWNTO value DO commands ENDFOR
| READ id SEMICOLON
| WRITE value SEMICOLON
;
expression : value
| value ADD value
| value SUB value
| value MUL value
| value DIV value
| value MOD value
;
condition : value EQ value
| value NEQ value
| value LT value
| value GT value
| value LE value
| value GE value
;
value : NUM
| id
;
id : PID
| PID L_BRACKET PID R_BRACKET
| PID L_BRACKET NUM R_BRACKET
;
%%
void yyerror(const char *msg) {
fprintf(stderr, "Compiling error: %s\n", msg);
}
如果您想知道,我从另一个文件运行 main 函数,但我认为这不是问题所在。
最佳答案
你的语法说有一个程序
,你必须有一个声明
:
program : DECLARE declaration ...
而获得声明的唯一途径就是这两条规则
declaration : declaration ...
| declaration ...
但这两者都要求您已经有一个声明
。由于您一开始什么都没有,而且如果您已经拥有一个声明
,您将永远无法拥有任何声明。
因此你永远无法解析一个程序
。
关于c - Bison 说开始符号不派生任何句子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53937174/
我有一个使用 Yacc 编写的语法。语法的相关部分摘录在这里 postfix : primary | postfix '[' expr ']' | postfix '[' ex
如何在 bison/yacc 中使用继承的属性? 说,我有这样的语法 - 程序 -> stmts 我想做的是在 Bison 身上: 程序:stmts {$$.next = newLabel(); $1
有什么方法可以更改 Bison 错误消息的格式?例如,不要说 syntax error, unexpected T_ID, expected ';' or T_IMPORT说 unexpected i
我的语法有这两个标记声明: %token RP %token ELSE 而这两条规则: Statement : IF LP Exp RP Statement; Statement : IF LP
如果有一个表单的输入文件: BEGIN stuff.... END BEGIN stuff ... END 我的 .y 文件是这样的 %token BEGIN %token END %star
我希望为现有语言创建一个 JavaScript 解析器,该语言目前具有笨拙的“手工制作”C# 和 Java 解析器。我想使用 Jison,并且也一直在尝试学习 Bison 的基础知识。 我不确定如何回
目前我正在研究一个源到源编译器,我已经编写了一个野牛解析器,可以正确地为输入创建 AST。我现在需要对语法树进行多次转换,因此我需要向树中插入许多节点。 我可以手动创建所有要添加到语法树中的结构体/联
如果有一个表单的输入文件: BEGIN stuff.... END BEGIN stuff ... END 我的 .y 文件是这样的 %token BEGIN %token END %star
我正在寻找为现有语言创建 JavaScript 解析器的方法,该语言目前具有笨拙的“手工制作”C# 和 Java 解析器。想用Jison,也在努力学习Bison的基础。 一个我不确定如何回答的问题是
我正在使用 flex/bison 编写解析器(我可以用 Python 编写解析器,但我总是更喜欢经典。) 当我用这个编译代码时: gcc -lfl -ly chance.tab.c lex.yy.c
正在使用 flex/bison 开发编译器。我的构建输出中有此警告。 警告:在默认操作中键入冲突 ('s' '') 请问有什么帮助吗? 最佳答案 它似乎与源中的 %token 和 %type 声明有关
考虑这个 lex.l 文件: %{ #include "y.tab.h" %} digit [0-9] letter [a-zA-Z] %% "+"
我正在为 bison 中的一个简单的 Pascal 编译器编写语法,我想可视化我在 pascal.y 中指定的语法的解析树。是否可以基于我的 pascal.y 文件以图形方式显示语法树? 最佳答案 野
我正在尝试编写一个能够使用以下输入的语法: begin #this is a example x = 56; while x > 0 do begin point 15
我正在尝试使用 BNF 语法编写 Flex/Bison 文件。但是,当我尝试编译时出现错误,而且我不确定如何调试它们。 BNF语法: ::= | head() ::=:: | @ | tail() |
我正在用 Flex/Bison 编写一个小程序来标记/解析我创建的查询语言。 我想知道是否有任何方法可以在 Flex/Bison 中创建任何关键字。 我的意思是:flex 将输入分解成一个标记列表,但
我正在尝试使用 flex 和 bison 创建过滤器,因为我想从复杂的语言中获取某些语法元素。我的计划是使用 flex + bison 来识别语法,并转储出感兴趣元素的位置。 (然后使用脚本根据转储的
我正在尝试实现一个可以进行浮点运算的 Flex/bison 计算器。我的 Flex 代码如下所示 %{ #include "calc.tab.h" #include void yyerror(cha
我正在尝试使用 FLEX 和 BISON 进行一些练习。 这是我写的代码: calc_pol.y %{ #define YYSTYPE double #include "calc_pol.tab.h"
我有一个使用括号和方括号作为分隔符的语法。当由 bison 生成的解析器输入带有不平衡分隔符的输入时,传递给 yyerror 的 YYLTYPE* 中的错误位置是输入的结尾。所以,例如,在输入 x
我是一名优秀的程序员,十分优秀!