2017-11-14 5 views
0

Beim Schreiben einer XText-Grammatik für einen einfachen SQL-Dialekt fand ich heraus, dass scheinbar Regeln, die nicht aus dem Startsymbol abgeleitet werden können, das Parsen beeinflussen.Wie wirken sich unterschwellige Regeln auf das Parsing aus?

z. der folgende (sehr vereinfacht) Auszug meiner Grammatik gegeben die in der Lage sein sollten Ausdrücke wie FROM table1; zu analysieren:

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

Beim Versuch, zu analysieren, um die Zeichenfolge FROM table1;, erhalte ich folgende Fehlermeldung:

'no viable alternative at input ';'' on EString

Wenn Ich entferne Regel with_clause, der Fehler ist weg und die Zeichenfolge wird ordnungsgemäß analysiert. Wie ist das möglich, obwohl with_clause nicht von Start abgeleitet werden kann?

Antwort

1

das Problem ist, dass das Prädikat (=>) erstreckt sich über eine Mehrdeutigkeit

vielleicht können Sie Präfix und Name

Table_name: 
    name=Qualified_name; 

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

an einem Strang ziehen, oder Sie versuchen, so etwas wie

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

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

ehemalige tatsächlich löst ein Problem mit meiner Grammatik. Tanks viel dafür. Dies beantwortet jedoch nicht die Frage, warum das Entfernen der unterstellbaren Regel ermöglicht, dass die Eingabe korrekt analysiert wird. Hast du eine Idee, warum das so ist? – Paddre

+0

Ich denke, die Regeln werden irgendwie irgendwo im Parser verwendet –

Verwandte Themen