Parsing 语法冲突:可能有多个动作

Parsing 语法冲突:可能有多个动作,parsing,bison,lalr,jison,Parsing,Bison,Lalr,Jison,我曾尝试用jison()编写简单的解析器,但在描述文本时遇到了困难 %lex %% [\s\n\t]+ return 'TK_SPACE'; [0-9]+("."[0-9]+)?\b return 'TK_NUMBER'; [a-zA-Z]+([a-zA-Z0-9]+)?\b return 'TK_WORD'; <<EOF>> return 'EOF'; /lex %star

我曾尝试用jison()编写简单的解析器,但在描述文本时遇到了困难

%lex

%%
[\s\n\t]+                   return 'TK_SPACE';
[0-9]+("."[0-9]+)?\b        return 'TK_NUMBER';
[a-zA-Z]+([a-zA-Z0-9]+)?\b  return 'TK_WORD';
<<EOF>>                     return 'EOF';

/lex

%start document

%%

document
  : nodes EOF
    { console.log($1); }
  | EOF
  ;

nodes
  : nodes node
    { $1.push($2); $$ = $1; }
  | node
    { $$ = [$1]; }
  ;

node
  : text
  ;

text
  : text text_element
    { $$ = $1 + $2; }
  | text_element
  ;

text_element
  : TK_NUMBER
  | TK_WORD
  | TK_SPACE
  ;

但如果我尝试解析文本,它就可以正常工作。这不是代码的完整版本,只是带有文本的版本。我想在feature中的
节点
处追加节点。

问题在于语法不明确--
节点
由一个或多个模式的节点组成,没有分隔符。
节点
是一个
文本
,它由一个或多个
文本元素
组成,同样没有分隔符。因此,无法判断一个
节点何时结束,下一个节点何时开始

例如,如果输入中有3个
text\u元素的序列
,则可能是一个包含所有3个元素的
节点
,也可能是3个
节点
,每个元素都有一个

Bison将通过始终选择shift而不是reduce来“解决”此冲突,后者将始终选择生成更大的
文本
对象,因此规则
节点:节点
将永远不会减少,也可以从语法中删除。由于这是一个纯粹的歧义(不是前瞻性问题),因此生成的语法与同一种语言匹配,因此这可能不是问题。我假设jison(或您实际使用的任何解析器生成器)是相同的


但是,一般来说,冲突是一个问题,因为这意味着生成的解析器解析的语法不是您指定的语法。找出结果解析器实际解析的语法是非常重要的,需要仔细理解shoft-reduce解析是如何工作的,以及解析器生成器实际生成的状态。信息都在
.output
文件中(由bison使用
-v
生成,其他生成器可能不同),但您需要阅读和理解它。

问题在于语法不明确--
节点由一个序列或没有分隔符的模式
节点组成。
节点
是一个
文本
,它由一个或多个
文本元素
组成,同样没有分隔符。因此,无法判断一个
节点何时结束,下一个节点何时开始

例如,如果输入中有3个
text\u元素的序列
,则可能是一个包含所有3个元素的
节点
,也可能是3个
节点
,每个元素都有一个

Bison将通过始终选择shift而不是reduce来“解决”此冲突,后者将始终选择生成更大的
文本
对象,因此规则
节点:节点
将永远不会减少,也可以从语法中删除。由于这是一个纯粹的歧义(不是前瞻性问题),因此生成的语法与同一种语言匹配,因此这可能不是问题。我假设jison(或您实际使用的任何解析器生成器)是相同的


但是,一般来说,冲突是一个问题,因为这意味着生成的解析器解析的语法不是您指定的语法。找出结果解析器实际解析的语法是非常重要的,需要仔细理解shoft-reduce解析是如何工作的,以及解析器生成器实际生成的状态。信息都在
.output
文件中(由bison使用
-v
生成,其他生成器可能不同),但您需要阅读和理解它。

如何描述xml元素中的文本<代码>文本
。我有这样的东西:
node:open_tag | close_tag | text
。我想我明白了。我已经解决了它,就像许多短元素一样。我将在之后加入他们。我如何描述xml元素中的文本<代码>文本
。我有这样的东西:
node:open_tag | close_tag | text
。我想我明白了。我已经解决了它,就像许多短元素一样。之后我会加入他们。
Conflict in grammar: multiple actions possible when lookahead token is TK_SPACE in state 5
- reduce by rule: node -> text
- shift token (then go to state 9)
Conflict in grammar: multiple actions possible when lookahead token is TK_WORD in state 5
- reduce by rule: node -> text
- shift token (then go to state 8)
Conflict in grammar: multiple actions possible when lookahead token is TK_NUMBER in state 5
- reduce by rule: node -> text
- shift token (then go to state 7)

States with conflicts:
State 5
  node -> text . #lookaheads= TK_SPACE TK_WORD TK_NUMBER EOF
  text -> text .text_element #lookaheads= EOF TK_NUMBER TK_WORD TK_SPACE
  text_element -> .TK_NUMBER
  text_element -> .TK_WORD
  text_element -> .TK_SPACE