2017-11-14 15 views
0

간단한 SQL 언어에 대한 XText 문법을 작성할 때, 시작 기호에서 파생되지 않는 규칙이 구문 분석에 영향을 미친다는 것을 알았습니다.불충분 규칙이 파싱에 어떻게 영향을 줍니까?

예. 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;, 나는 다음과 같은 오류 얻을 문자열 구문 분석하려고 :

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

하는 경우를 규칙 with_clause을 제거하면 오류가 사라지고 문자열이 제대로 구문 분석됩니다. with_clauseStart에서 파생되지 않아도 어떻게 가능합니까?

답변

1

문제는 술어 (=>)를 사용하면 접두사와 이름

Table_name: 
    name=Qualified_name; 

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

을 함께 뽑을 수

어쩌면 모호성을 커버하거나

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

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

실제로 전을 해결해 뭔가를 시도한다는 것입니다 내 문법에 관한 문제. 그것을 위해 많은 탱크. 그러나이 규칙을 사용하면 입력을 올바르게 구문 분석 할 수없는 이유에 대한 답을 얻을 수 없습니다. 왜 이런 경우인지 알고 있습니까? – Paddre

+0

나는 규칙이 어떻게 든 파서의 어딘가에서 사용된다고 생각한다. –