- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在编译我的 yacc 文件时,我遇到了移位/归约冲突。我似乎无法解决,那我怎么找呢?错误指向第 73 行,这是 auxVartSpec
生产定义的行,特别是它的第二个生产 auxVarSpec COMMA ID
但我已经为这些标记设置了 de precedences .
%
%token <value> SEMICOLON BLANKID PACKAGE RETURN AND ASSIGN STAR COMMA DIV EQ GE GT LBRACE LE LPAR LSQ LT MINUS MOD NE NOT OR PLUS RBRACE RPAR RSQ ELSE FOR IF VAR INT FLOAT32 BOOL STRING PRINT PARSEINT FUNC CMDARGS RESERVED ID INTLIT REALLIT STRLIT
%type <node> Program Declarations VarDeclaration VarSpec Type FuncDeclaration FuncHeader Parameters FuncBody VarsAndStatements Statement ParseArgs FuncInvocation Expr auxDeclarations auxVarSpec auxParameters auxStatement auxFuncInvocation opcType opcParameters opcExpr opcFuncInvocation
%nonassoc IFX
%nonassoc ELSE
%left COMMA
%right ASSIGN
%left OR
%left AND
%left EQ NEQ
%left LT GT LEQ GEQ
%left PLUS MINUS
%left STAR DIV MOD
%right NOT
%%
Program: PACKAGE ID SEMICOLON Declarations
;
Declarations: auxDeclarations
auxDeclarations: %empty
| auxDeclarations VarDeclaration SEMICOLON
| auxDeclarations FuncDeclaration SEMICOLON
;
VarDeclaration: VAR VarSpec
| ID auxVarSpec Type
;
VarSpec: ID auxVarSpec Type
;
auxVarSpec: %empty
| auxVarSpec COMMA ID
;
Type: INT
| FLOAT32
| BOOL
| STRING
;
FuncDeclaration: FUNC FuncHeader FuncBody
;
FuncHeader: ID LPAR opcParameters RPAR opcType
;
opcType: %empty
| Type
;
Parameters: ID Type auxParameters
opcParameters: %empty
| Parameters
;
auxParameters: %empty
| auxParameters COMMA ID Type
;
FuncBody: LBRACE VarsAndStatements RBRACE
VarsAndStatements: VarsAndStatements SEMICOLON
| VarsAndStatements VarDeclaration SEMICOLON
| VarsAndStatements Statement SEMICOLON
| %empty
;
Statement: ID ASSIGN Expr
| LBRACE auxStatement RBRACE
| IF Expr LBRACE auxStatement RBRACE %prec IFX
| IF Expr LBRACE auxStatement RBRACE ELSE LBRACE auxStatement RBRACE
| FOR opcExpr LBRACE auxStatement RBRACE
| RETURN opcExpr
| FuncInvocation
| ParseArgs
| PRINT LPAR Expr RPAR
| PRINT LPAR STRLIT RPAR
;
opcExpr: %empty
| Expr
;
auxStatement: %empty
| auxStatement Statement SEMICOLON
;
ParseArgs: ID COMMA BLANKID ASSIGN PARSEINT LPAR CMDARGS LSQ Expr RSQ RPAR
FuncInvocation: ID LPAR opcFuncInvocation RPAR
auxFuncInvocation: %empty
| COMMA Expr
;
opcFuncInvocation: %empty
| Expr auxFuncInvocation
;
Expr: Expr OR Expr
| Expr AND Expr
| Expr LT Expr
| Expr GT Expr
| Expr EQ Expr
| Expr NE Expr
| Expr LE Expr
| Expr GE Expr
| Expr PLUS Expr
| Expr MINUS Expr
| Expr DIV Expr
| Expr MOD Expr
| NOT Expr
| MINUS Expr
| PLUS Expr
| INTLIT
| REALLIT
| ID
| FuncInvocation
| LPAR Expr RPAR
%%
最佳答案
您看到的错误消息表明您的文件中有 73 个移位/归约冲突,而不是第 73 行有移位/归约冲突。(移位/归约冲突对应于解析器状态,而不是行号。你可以通过使用 -v
命令行选项生成报告文件来查看冲突的位置。)
在这些冲突中,有 72 起是简单的拼写错误造成的。您的语法在 Expr
的产生式中使用标记名称 NE
、GE
和 LE
,但您的优先级声明是标记 NEQ
、GEQ
和 LEQ
。这会产生有关未使用 token 的警告。 (同样未使用的还有 STAR
和 RESERVED
。我猜你不小心漏掉了乘法的 Expr
规则。)
剩下的冲突在状态45,其项目是(来自报告文件):
State 45
7 VarDeclaration: ID . auxVarSpec Type
29 Statement: ID . ASSIGN Expr
43 ParseArgs: ID . COMMA BLANKID ASSIGN PARSEINT LPAR CMDARGS LSQ Expr RSQ RPAR
44 FuncInvocation: ID . LPAR opcFuncInvocation RPAR
(附加到每个生产的数字是生产编号,而不是行号。生产编号位于报告文件的顶部,但由于生产也被列出,因此它们在这里没有太大区别. 每个产生式中的.
表示先行点. 除非指定--report=itemset
)
冲突与前瞻COMMA
:
COMMA shift, and go to state 68
COMMA [reduce using rule 9 (auxVarSpec)]
因此在这种状态下,可以移动逗号以继续生产 43。或者可以使用规则 9 (auxVarSpec: %empty
) 触发缩减。这种减少是可能的,因为有一个项目以 auxVarSpec
作为其下一个非终结符,并且 auxVarSpec
如果不为空则以逗号开头。
为了可能更清楚,问题是在列表 VarsAndStatements
中,可能有一个 VarDeclaration
(这是一个声明)但也可能有一个 ParseArgs
(这是一条语句)。所以ParseArgs
和VarDeclaration
都是可以的,而且都可以ID COMMA
开头,但是其中一个需要减少一个空的权利- ID
和 COMMA
之间的手边。
如果没有额外的先行标记,则无法解决该冲突:如果逗号后跟另一个 ID
,则解析器正在查看 VarDeclaration
,而如果逗号后跟一个 BLANKID
(无论是什么),那么它必须是一个 ParseArgs
。
虽然冲突不能像写的那样解决,但可以通过推迟移位/归约决策的常用技术来避免。特别需要区分三种情况:
ID Type /* VarDeclaration */
ID COMMA ID ... /* VarDeclaration */
ID COMMA BLANKID ... /* ParseArgs */
一种方法是添加明显冗余的产生式:
VarDeclaration: VAR VarSpec
| ID Type
| ID COMMA ID auxVarSpec Type
关于c - 如何在 yacc 文件中查找 shift/reduce 冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55435670/
我不知道如何从 reducerRegister.js 中的 reducerForm.js reducer 访问 bool 值 isLoading 标志。我使用了 combineReducers() 并
我正在尝试找到一种理想的方法来更新我的状态树上的几个顶级字段,同时仍然维护拆分 reducer 。 这是我想出的一个简单的解决方案。 var state = { fileOrder: [0],
如果我们想按相同的键(第一个 reducer 的输出)分组,是否可以将 reducer 的输出直接发送到另一个 reducer 有时在链接时我发现我正在使用一个映射器来读取输入并将其复制到输出。因此想
我有一个如下所示的 reducer : const chart = combineReducers({ data, fetchProgress, fetchError,
当Map Reduce代码中有多个reduce时,它们之间没有任何形式的通信。但是,当执行诸如聚合之类的操作时,所有化简器共同产生单个最终输出。当它们之间没有通信时,聚合如何发生?是通过写入上下文吗?
我在 hive 中有一个表,我想从中获取所有数据。问题是: select * from tbl; 给我的结果与以下情况截然不同: select count(*) from tbl; 这是为什么?第二个
假设我有一个带有两个 reducer 的应用程序 - 使用 combineReducers() 组合的 tables 和 footer。 当我点击某个按钮时,将分派(dispatch)两个操作 - 一
我正在学习更深入的 redux,并且在处理高阶 reducer 时遇到一些麻烦。 我试图使用一个简单的分页示例来了解它是如何工作的。 NB:下面的代码只是 Nodejs 上下文中 redux 的一个快
我调用 RSS 提要并使用解析器对其进行解析。我收到一个数组。我现在想在最后创建一个对象,看起来像这样: { "2019-06-13": { "rates": { "usd":
我有一份学生列表,我的应用程序始终显示当时的一个学生,即 activePupil。到目前为止我有两个 reducer 。其中一个包含并默认返回所有子项的列表(以数组的形式): [ { id:
我有一个叫做 animals 的特征缩减器(切片缩减器)。我想将这些 reducer 拆分为哺乳动物、鸟类、鱼类等。这部分很简单,因为我可以简单地使用 ActionReducerMap。 现在假设哺乳
空数组上的简单reduce会抛出: 线程“main”java.lang.UnsupportedOperationException 中的异常:无法减少空的可迭代对象。 链接时同样的异常: val a
我有一些 25k 文档(原始 json 中为 4 GB)的数据,我想对其执行一些 javascript 操作,以使我的最终数据使用者 (R) 更容易访问这些数据,并且我想通过为每个更改添加一个新集合来
我只是想验证我对这些参数及其关系的理解,如果我错了请通知我。 mapreduce.reduce.shuffle.input.buffer.percent 告诉分配给 reducer 的整个洗牌阶段的内
我想将 redux 状态的值从 reducer 传递到另一个 reducer。在我的例子中,我想将 groups 的值从 groupReducer.js 中的状态传递到 scheduleReducer
所以,我有一个应用程序,它有多个 reducer ,因此有多个关联的 Action 创建者。 有一段时间,我的一个 reducer 更新了状态(由于编辑),因此,我必须确保其他 reducer 看到此
我有一个 reducer ,可以在调度操作时重新调整适当的状态。现在我定期调用 API,因此结果会一次又一次地触发操作。所以我想要的是,如果 reducer 状态已经有数据,那么另一个 reducer
当我尝试执行来自 here 的 DISTINCT reduce 时,出现错误。我已经在啤酒 sample 桶上重现了这个错误,所以这应该很容易重现。我没有在 mapreduce_errors.txt
在以下语法的简单优先级解析(分解)中,我们存在 shift-reduce 和 reduce-reduce 冲突。 X 是开始符号,X'-->$X$ 是添加规则。另外+和下符号是终结符。 X'-->$X
我需要编写一个连续调用两个reducer的Mapreduce程序。即,第一个 reducer 的输出将是第二个 reducer 的输入。我如何实现这一目标? 到目前为止我发现的内容表明我需要在我的驱动
我是一名优秀的程序员,十分优秀!