2012-05-24 2 views
1

Я использую ANTLR для анализа языка пользовательских данных. Я использую C как язык, и я выводил абстрактное синтаксическое дерево. До сих пор так хорошо, но теперь мне нужно добавить документацию и мне нужно, чтобы блоки формы:Проводя комментарий с помощью antlr

DOC 
Free text here 
ENDDOC 

Я попытался добавить правило:

docstm : 'DOC' ContentDoc=(.*) 'ENDDOC' -> ^(T_DOCCLASS $ContentDoc); 

где T_DOCCLASS представляет собой воображаемую лексема определена в раздел tokens {...}. К сожалению, хотя анализ синтаксического анализа блока DOC ... ENDDOC не прерывается, дерево имеет только T_DOCCLASS без какого-либо дочернего узла.

Другая дополнительная информация: Я использую ANTLR 3.2 и следующие прелюдия:

options { 
output = AST; 
language = C; 
ASTLabelType = pANTLR3_BASE_TREE; 
} 

и у меня есть еще одно правило для пропуска withespaces:

WS : (' ' 
    | '\t' 
    | '\r' 
    | '\n' 
    ) {$channel=HIDDEN;} 
; 

Заранее спасибо за любые предложения вы можете дать мне.

+0

Какой вопрос? Попытайтесь прекратить хотя бы одно предложение с вопросительным знаком. – ceving

+1

@ceving, хотя фактического вопросительного знака нет, ясно, что пытается сделать OP (по крайней мере, ясно, если вы немного знаете ANTLR). –

ответ

1

Вместо .* (! Нуля или более лексем, в правилах синтаксического анализа), это безопаснее сделать (~ENDDOC)* (кроме ENDDOC ноль или более лексем):

docstm  : DOC innerDocstm ENDDOC -> ^(T_DOCCLASS innerDocstm); 
innerDocstm : (~ENDDOC)*; 
DOC   : 'DOC'; 
ENDDOC  : 'ENDDOC'; 
ID   : ('a'..'z' | 'A'..'Z')+; 
WS   : (' ' | '\t' | '\r' | '\n') {$channel=HIDDEN;}; 

в результате чего:

enter image description here

Как вы можете видеть, в пределах T_DOCCLASS АСТ нет пробелов. Если вы хотите сохранить пробелы, нужно поместить правило в лексером:

DOCSTM : 'DOC' .* 'ENDDOC'; 

(вы должны использовать .* сейчас)

+0

Большое спасибо, видя другие вопросы, касающиеся antlr здесь, на SO, я подозревал, что вы можете быть очень полезными :-) –