【发布时间】:2010-12-02 00:37:12
【问题描述】:
我正在为国际象棋代数符号开发 BNF,遇到了一个有趣的案例,输入到错误的非终端。
我的开始 BNF 规则如下(请注意,这故意不包括 castling 或 notes):
algebraic_notation : piece start_position capture end_position promotion
piece、start_position、capture 和 promotion 可以为空,从而允许像 'd4' 这样的移动。问题是当输入这样的移动时,输入('d4') 被start_position 占用,从而导致错误b/c 没有更多输入用于end_position,不能为空。
显而易见的破解/解决方法是让end_position 为空,然后检查我们是否有任何输入并采取相应措施。
这确实有效,但我想知道是否有办法解决这个问题。如果导致整个表达式不匹配,输入是否可能不去第一个匹配的符号?
另一个问题是这是 BNF 的标准行为,还是我正在使用的 yaccer 的问题:PLY v 3.3。
尝试使用 flex/bison 并得到相同的结果。所以它似乎并不特定于 PLY。
以下是完整性的所有相关规则:
algebraic_notation : piece start_position capture end_position promotion
piece : KING
| QUEEN
| BISHOP
| KNIGHT
| ROOK
| pawn
pawn : empty
start_position : FILE
| NUMBER
| FILE NUMBER
| empty
end_position : FILE NUMBER
| empty // this line is the hack/workaround
capture : CAPTURE
| empty
promotion : EQUAL QUEEN
| EQUAL ROOK
| EQUAL KNIGHT
| EQUAL BISHOP
| empty
empty :
【问题讨论】:
-
yacc 对于这个问题是不是有点矫枉过正?
-
@cam 也许。但是根据我的经验,手动解析字符串并不是那么清晰或可读。
-
另外,即使 BNF 对于这个特定的应用程序来说太过分了,在更复杂的语法中仍然可能遇到这个问题。无论如何,我有一个解决方法/黑客;我只是想尽可能使用更好的解决方案。