- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我原以为 if else 会发生 shift/reduce 冲突,但它在“| IF '(' boolean_statement ')' block ”行上给出了 reduce/reduce 冲突。
这里有一些信息可能有助于解释以下代码:
BOOL
是每行开头使用的关键字标记,表示该行是 bool 运算
BOOLEAN
是“真”或“假”值
我正在使用此编译器将一种语言转换为 C 代码,该语言可以包含类似 a,b,c=d+2
的语句,它等同于 a= b=c=d+2
在 C 中;和 bool e = f * .N。 g + h
,相当于 e = f && !g || h
.
statements:
statements statement
| statement
;
statement:
if_statement
| BOOL variable_list '=' boolean_statement
| variable_list '=' integer_statement
;
if_statement:
IF '(' boolean_statement ')' block ELSE block
| IF '(' boolean_statement ')' block
;
variable_list:
variable_list ',' variable
| variable
;
variable:
STRING
| STRING '[' INTEGER ']'
| STRING '[' STRING ']'
;
boolean_statement:
'(' boolean_statement ')'
| bval '*' boolean_statement
| bval '+' boolean_statement
| bval EQ boolean_statement
| bval NEQ boolean_statement
| NOT boolean_statement
| bval
;
bval:
BOOLEAN
| variable
;
integer_statement:
'(' integer_statement ')'
| value '+' integer_statement
| value '*' integer_statement
| value
;
value:
INTEGER
| variable
;
block:
statement
| '{' statements '}'
;
完整代码如下
%{
#include <cstdio>
#include <iostream>
using namespace std;
//stuff from flex that bison needs to know about:
extern "C" int yylex();
extern "C" int yyparse();
extern "C" FILE *yyin;
extern int line_num;
void yyerror(const char *s);
%}
//C union holding each of the types of tokens that Flex could return
%union {
int ival;
bool bval;
char const *sval;
}
//symbol defination
%token <sval> STRING;
%token <sval> NOT
%token CONSTANT_SECTION
%token BOOLEAN_SECTION
%token INTEGER_SECTION
%token LOGIC_SECTION
%token TIMER_SECTION
%token <sval> BOOLEAN
%token <ival> INTEGER
%token <ival> HEX
%token ENDL
%token BOOL
%token IF
%token ELSE
%token EQ NEQ
%token AND
%token OR
%token SUBROUTINE_END
%token SUBROUTINE_START
%token DELAY SECONDS HOURS MINUTES MSEC
%token GOTO
%token LABEL
%token CALL
//end of declaration section
%%
logic:
costants_declarations boolean_declarations integer_declarations timer_declarations logic_statements
| boolean_declarations integer_declarations timer_declarations logic_statements
| logic_statements
;
costants_declarations:
CONSTANT_SECTION constants
;
constants:
constants STRING '=' INTEGER { cout << "const int " << $2 << " = " << $4 << ";" << endl; }
| constants STRING '=' HEX { cout << "const int " << $2 << " = " << $4 << ";" << endl; }
| STRING '=' INTEGER { cout << "const int " << $1 << " = " << $3 << ";" << endl; }
| STRING '=' HEX { cout << "const int " << $1 << " = " << $3 << ";" << endl; }
;
boolean_declarations:
BOOLEAN_SECTION booleans
;
booleans:
booleans ',' boolean
| booleans boolean
| boolean
;
boolean:
STRING '[' INTEGER ']' { cout << "bool " << $1 << "[" << $3 << "]" << ";" << endl; }
| STRING '[' STRING ']' { cout << "bool " << $1 << "[" << $3 << "]" << ";" << endl; }
| STRING { cout << "bool " << $1 << " = true;" << endl; }
;
integer_declarations:
INTEGER_SECTION integers
;
integers:
integers ',' integer
| integers integer
| integer
;
integer:
STRING '[' INTEGER ']' { cout << "int " << $1 << "[" << $3 << "]" << ";" << endl; }
| STRING '[' STRING ']' { cout << "int " << $1 << "[" << $3 << "]" << ";" << endl; }
| STRING { cout << "int " << $1 << " = 0;" << endl; }
;
timer_declarations:
TIMER_SECTION timers
;
timers:
timers ',' timer
| timers timer
| timer
;
timer:
STRING { cout << "int " << $1 << ";" << endl; }
;
logic_statements:
LOGIC_SECTION subroutines statements
;
subroutines:
/* empty */
| SUBROUTINE_START STRING statements SUBROUTINE_END STRING
;
statements:
statements statement
| statement
;
statement:
if_statement
| delay_statement
| GOTO STRING
| LABEL
| CALL STRING
| BOOL variable_list '=' { cout << " = "; } boolean_statement { cout << ";\n"; }
| variable_list '=' { cout << " = "; } integer_statement { cout << ";\n"; }
;
if_statement:
IF '(' { cout << "if("; } boolean_statement ')' { cout << ")" << endl; } block
| IF '(' { cout << "if("; } boolean_statement ')' { cout << ")" << endl; } block ELSE block
;
delay_statement:
DELAY '=' INTEGER SECONDS statement
;
variable_list:
variable_list ',' { cout << " = "; } variable
| variable
;
variable:
STRING { cout << $1; }
| STRING '[' INTEGER ']' { cout << $1 << "[" << $3 << "]"; }
| STRING '[' STRING ']' { cout << $1 << "[" << $3 << "]"; }
;
boolean_statement:
'('{ cout << "("; } boolean_statement ')'{ cout << ")"; }
| bval '+' { cout << " || "; } boolean_statement
| bval OR { cout << " || "; } boolean_statement
| bval '*' { cout << " && "; } boolean_statement
| bval AND { cout << " && "; } boolean_statement
| bval EQ { cout << " == "; } boolean_statement
| bval NEQ { cout << " != "; } boolean_statement
| NOT { cout << $1; } boolean_statement
| bval
;
bval:
BOOLEAN { cout << $1; }
| variable
;
integer_statement:
'('{ cout << "("; } integer_statement ')'{ cout << ")"; }
| value '+'{ cout << " + "; } integer_statement
| value '*'{ cout << " * "; } integer_statement
| value
;
value:
INTEGER { cout << $1; }
| variable
;
block:
{ cout << "{" << endl; } statement { cout << "}" << endl; }
| '{' { cout << "{" << endl; } statements '}' { cout << "}" << endl; }
;
//end of grammer section
%%
int main(int argc, char *argv[]) {
// default input is stdin
// if file is given read from it
if(argc == 2)
{
// open a file handle to a particular file:
FILE *myfile = fopen(argv[1], "r");
// make sure it's valid:
if (!myfile) {
cout << "Can't open "<< argv[1] <<" file" << endl;
cout << "Usage: " << argv[0] << " <filename>\n";
return -1;
}
// set lex to read from it instead of defaulting to STDIN:
yyin = myfile;
}
else if(argc != 1)
{
cout << "Usage: " << argv[0] << " <filename>\n";
cout << "Usage: " << argv[0] << endl;
return -1;
}
// parse through the input until there is no more:
do
{
yyparse();
} while (!feof(yyin));
}
void yyerror(const char *s) {
cout << "Parse error on line " << line_num << "! Message: " << s << endl;
// might as well halt now:
exit(-1);
}
最佳答案
问题不在于 IF
说法准确。这是 if_statement
的两个作品中的中间规则 Action (MRA) :
if_statement:
IF '(' { cout << "if("; } boolean_statement ')' { cout << ")" << endl; } block
| IF '(' { cout << "if("; } boolean_statement ')' { cout << ")" << endl; } block ELSE block
;
中间规则操作,例如 { cout << "if("; }
, 被翻译成一个唯一命名的空非终结符。实际上,上述产生式变成了以下形式:
if_statement:
IF '(' @3 boolean_statement ')' @4 block
| IF '(' @5 boolean_statement ')' @6 block ELSE block
;
@3: %empty { cout << "if("; } ;
@4: %empty { cout << ")" << endl; } ;
@5: %empty { cout << "if("; } ;
@6: %empty { cout << ")" << endl; } ;
在上面,@3
和 @5
是相同的(与 @4
和 @6
一样),但 bison 不检查;每个 MRA 都被认为是独一无二的。这会导致减少/减少冲突,因为一旦解析器读取了 if (,它将需要减少 @3
或 @5
之一,然后才能移动以下标记,无论该标记可能是什么,但下一个标记没有提供关于 else 是否最终会出现的线索。(两个产品都以 boolean_statement
继续,因此以下标记在任何一种情况下都可以是 FIRST(boolean_statement)
中的任何标记。)
冲突以有利于 @3
的方式解决的事实(文本上较早的非终结符)表示 @5
永远不能减少, Bison 对此提供了警告。 (至少,我的 Bison 版本做到了。)
这是 MRA 的一个经典问题,非常常见,因此需要在 bison manual 中有一节.
在这种情况下,您可以简单地通过左因式分解来解决问题:
if_statement:
if_then
| if_then ELSE block
;
if_then:
IF '(' { cout << "if("; }
boolean_statement ')' { cout << ")" << endl; }
block
;
关于compiler-construction - Bison 减少/减少冲突 if else 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28306983/
我是 Bison 解析的新手,我无法理解它是如何工作的。我有以下语法,其中我保留了最低限度的语法来突出问题。 %left '~' %left '+' %token T_VARIABLE %% star
我链接了 2 个映射器和 1 个缩减器。是否可以将中间输出(链中每个映射器的 o/p)写入 HDFS?我尝试为每个设置 OutputPath,但它似乎不起作用。现在,我不确定是否可以完成。有什么建议吗
我正在编写一些代码来管理自定义磁盘文件结构并将其同步到未连接的系统。我的要求之一是能够在实际生成同步内容之前估计同步的大小。作为一个简单的解决方案,我整理了一个包含完整路径文件名的 map ,作为高效
我来自一个 SQL 世界,其中查找由多个对象属性(published = TRUE 或 user_id = X)完成,并且有 任何地方都没有加入 (因为 1:1 缓存层)。文档数据库似乎很适合我的数据
在 R 中,我有一个整数向量。从这个向量中,我想随机减少每个整数元素的值,以获得向量的总和,即初始总和的百分比。 在这个例子中,我想将向量“x”减少到向量“y”,其中每个元素都被随机减少以获得等于初始
我发现自己遇到过几次我有一个 reducer /组合 fn 的情况,如下所示: def combiner(a: String, b: String): Either[String, String]
Ubuntu 12.04 nginx 1.2.4 avconv版本 avconv version 0.8.10-4:0.8.10-0ubuntu0.12.04.1, Copyright (c) 200
我是 R 编程语言的新手。我有一个包含 2 列(ID 和 Num)的数据集,如下所示: ID Num 3 8 3 12 4 15 4 18 4
我正在使用高阶函数将函数应用于向量中的每个元素并将结果作为标量值返回。 假设我有: v = c(0, 1, 2, 3, 4, 5, 6, 7, 8) 我想计算以左边 5 个整数为中心的所有这些整数的总
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
这个问题在这里已经有了答案: How to write the dataframes in a list to a single csv file (2 个回答) 5年前关闭。 我正在尝试使用 Red
刚开始学习CUDA编程,对归约有些迷茫。 我知道与共享内存相比,全局内存有很多访问延迟,但我可以使用全局内存来(至少)模拟类似于共享内存的行为吗? 例如,我想对长度恰好为 BLOCK_SIZE * T
我经常使用OptiPNG或pngcrush减小PNG图像的文件大小。 我希望能够从.NET应用程序中以编程方式执行此类操作。我正在动态生成要发送到移动设备的PNG,因此我想减小文件大小。 图像质量很重
减少和减少让您在序列上累积状态。 序列中的每个元素都会修改累积的状态,直到 到达序列的末尾。 在无限列表上调用reduce 或reductions 有什么含义? (def c (cycle [0]))
这与R: use the newly generated data in the previous row有关 我意识到我面临的实际问题比我在上面的线程中给出的示例要复杂一些 - 似乎我必须将 3 个
有什么办法可以减少.ttf字体的大小?即如果我们要删除一些我们不使用的glyps。 最佳答案 使用Google Web Fonts,您可以限制字符集,例如: //fonts.googleapis.co
我需要在iOS中制作一个应用程序,在她的工作过程中发出类似“哔”的声音。 我已经使用MPMusicPlayerController实现了与背景ipod的交互。 问题: 由于来自ipod的音乐音量很大,
我有一个嵌套 map m,如下所示: m = Map("电子邮件"-> "a@b.com", "背景"-> Map("语言"-> "英语")) 我有一个数组arr = Array("backgroun
有什么原因为什么不应该转发map / reduce函数中收到的可写内容? 我的意思是-每个map / reduce函数都有一个可写的键/值,并可能发出一个键/值对。如果我想执行一些过滤,我应该只发出接
假设我有一个数据列表 val data = listOf("F 1", "D 2", "U 1", "D 3", "F 10") 我想执行每个元素的给定逻辑。 我必须在外部添加 var acc2 =
我是一名优秀的程序员,十分优秀!