2013-07-04 3 views
0

мне нужно разобрать следующиеANTLR внутри скобок

model { 

// any content, including brackets {} 

var x= {} ; 

// any content, including brackets {} 
} 

Если я делаю это так:

model : MODEL OBR modelBody CBR; 

modelBody: modelBodyLine; 

modelBodyLine: TEXT* (OBR TEXT* CBR)* TEXT*; 

TEXT : ('a'..'z'|'A'..'Z'| '_' | '-')+ ; 
OBR: '{'; 
CBR: '}'; 

Я получаю эту ошибку

предупреждение (200):/SWL Parser/src/ro/sft/swl/language/parser/SWL.g: 46: 16: Решение может соответствовать вводу, например «ТЕКСТ», с использованием нескольких альтернатив: 1, 2 В результате альтернативы (2) были отключены для этого входа | ---> modelBodyLine: ТЕКСТ * (ОБР ТЕКСТ * ЦБР) * ТЕКСТ *;

Так что было бы лучшим способом разобрать его?

ответ

1

Я использую следующее правило genericBlock для этих ситуаций. Это правило полагается на ваш lexer на минимум правильно вернуть токен CBR для окончательного } и правильно сопоставить токен CBR для каждого вложенного токена OBR.

genericBlock 
    : OBR 
    (~(OBR | CBR) 
    | genericBlock 
    )* 
    CBR 
    ; 
+0

Спасибо за ответ. Проблема в том, что если я пытаюсь разобрать что-то вроде 'model {some text}', то он переходит в бесконечный цикл. Грамматика такова: 'model: MODEL modelBody; модельBody: genericBlock; genericBlock : ОБР (~ (ОБР | CBR) | genericBlock ) * CBR ; '. Надеюсь, вы сможете обнаружить проблему :) – victor

+0

другой шаблон, который вызывает бесконечный цикл: 'model {var cv =; } ' – victor

+0

У вас есть правило lexer, которое может соответствовать пустой строке (например,' WS: '\ t' *; ', когда это должно быть' WS: '\ t' +; ') * и * у вас есть некоторые ввод, который соответствует правилу * no * lexer. –

Смежные вопросы