Parsing 未激活的规则如何影响解析?

Parsing 未激活的规则如何影响解析?,parsing,xtext,Parsing,Xtext,在为简单的SQL方言编写XText语法时,我发现,显然不能从start符号派生的规则会影响解析 例如,给出以下(非常简化的)语法摘录,它应该能够解析表1中的之类的表达式: Start: subquery ';'; subquery: /*select=select_clause */tables=from_clause; from_clause: 'FROM' tables; tables: tables+=table (',' tables+=tabl

在为简单的SQL方言编写XText语法时,我发现,显然不能从start符号派生的规则会影响解析

例如,给出以下(非常简化的)语法摘录,它应该能够解析表1中的
之类的表达式

Start:
    subquery ';';  

subquery:
    /*select=select_clause */tables=from_clause;

from_clause:
    'FROM' tables;

tables:
    tables+=table (',' tables+=table)*;

table:
    name=table_name (alias=alias)?;

table_name: 
    prefix=qualified_name_prefix? name=qualified_name;

qualified_name_prefix:
    ID'.';

qualified_name :
    =>qualified_name_prefix? ID;

alias returns EString:
    'AS'? alias=ID;

with_clause : 
    'WITH' elements+=with_list_element (',' elements+=with_list_element)*;

with_list_element : 
     name=ID (column_list_clause=column_list_clause)? 'AS' '(' subquery=subquery ')';

column_list_clause : 
    '(' names+=ID+ ')';
当试图解析表1中的字符串
,我得到以下错误:

“输入时没有可行的替代方案”;“”勒索


如果我删除规则
和_子句
,则错误消失,字符串被正确解析。即使不能从
Start
派生出
with\u子句,这怎么可能呢?

问题是谓词(
=>
)包含歧义

也许你可以把前缀和名字放在一起

Table_name: 
     name=Qualified_name;

Qualified_name :
   (ID '.' (ID '.')?)? ID;
或者你试试类似的东西

Table_name: 
    ((prefix=ID ".")? =>name=Qualified_name);

Qualified_name :
   =>(ID '.' ID) | ID;

前者确实解决了我的语法问题。我为此付出了很多。然而,这并不能回答为什么删除不可激活规则可以正确解析输入的问题。你知道为什么会这样吗?我认为这些规则在解析器的某个地方被使用了