不可判断的规则如何影响解析?

时间:2017-11-14 17:00:40

标签: parsing xtext

当为简单的SQL方言编写XText语法时,我发现,显然无法从起始符号派生的规则会影响解析。

E.g。给出了我的语法的以下(非常简化的)提取,它应该能够解析像FROM table1;这样的表达式:

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+ ')';

尝试解析字符串FROM table1;时,出现以下错误:

  

'输入中没有可行的替代方案''''在EString上

如果删除规则with_clause,则错误消失,字符串被正确解析。即使无法从with_clause

导出Start,这怎么可能呢?

1 个答案:

答案 0 :(得分:1)

问题在于谓词(=>)涵盖了歧义

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

Table_name: 
     name=Qualified_name;

Qualified_name :
   (ID '.' (ID '.')?)? ID;

或尝试类似

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

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