当为简单的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
,这怎么可能呢?
答案 0 :(得分:1)
问题在于谓词(=>
)涵盖了歧义
也许你可以把前缀和名字拉在一起
Table_name:
name=Qualified_name;
Qualified_name :
(ID '.' (ID '.')?)? ID;
或尝试类似
的内容Table_name:
((prefix=ID ".")? =>name=Qualified_name);
Qualified_name :
=>(ID '.' ID) | ID;