Я занимаюсь изучением разбора языка для удовольствия ...Как создать TreeParser в ANTLR3?
Я создал грамматику ANTLR, которая, я считаю, будет соответствовать простому языку, который я надеюсь реализовать. Она будет иметь следующий синтаксис:
<FunctionName> (<OptionalArguments>+) {
<OptionalChildFunctions>+
}
Actual Пример:
ForEach(in:[1,2,3,4,5] as:"nextNumber") {
Print(message:{nextNumber})
}
Я считаю, у меня есть грамматика работает правильно, чтобы соответствовать этой конструкции, и теперь я attemping построить дерево абстрактного синтаксиса для язык.
Во-первых, я должен признать, что я не совсем уверен, КАК это дерево должно выглядеть. Во-вторых, у меня полная потеря, как это сделать в моей грамматике Antlr ... Я пробовал без особых успехов часами.
Это настоящая идея, с которой я иду, для дерева - пожалуйста, со мной! :)
FunctionName
/ \
Attributes \
/\ /\
ID /\ ChildFunctions
/\ ID etc
/ \
Attribute AttributeValue
Type
Это мой текущий Antlr файл грамматика:
grammar Test;
options {output=AST;ASTLabelType=CommonTree;}
program : function ;
function : ID (OPEN_BRACKET (attribute (COMMA? attribute)*)? CLOSE_BRACKET)? (OPEN_BRACE function* CLOSE_BRACE)?;
attribute : ID COLON datatype;
datatype : NUMBER | STRING | BOOLEAN | array | lookup ;
array : OPEN_BOX (datatype (COMMA datatype)*)? CLOSE_BOX ;
lookup : OPEN_BRACE (ID (PERIOD ID)*) CLOSE_BRACE;
NUMBER
: ('+' | '-')? (INTEGER | FLOAT)
;
STRING
: '"' (ESC_SEQ | ~('\\'|'"'))* '"'
;
BOOLEAN
: 'true' | 'TRUE' | 'false' | 'FALSE'
;
ID : (LETTER|'_') (LETTER | INTEGER |'_')*
;
COMMENT
: '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
| '/*' (options {greedy=false;} : .)* '*/' {$channel=HIDDEN;}
;
WHITESPACE : (' ' | '\t' | '\r' | '\n') {$channel=HIDDEN;} ;
COLON : ':' ;
COMMA : ',' ;
PERIOD : '.' ;
OPEN_BRACKET : '(' ;
CLOSE_BRACKET : ')' ;
OPEN_BRACE : '{' ;
CLOSE_BRACE : '}' ;
OPEN_BOX : '[' ;
CLOSE_BOX : ']' ;
fragment
LETTER
: 'a'..'z' | 'A'..'Z'
;
fragment
INTEGER
: '0'..'9'+
;
fragment
FLOAT
: INTEGER+ '.' INTEGER*
;
fragment
ESC_SEQ
: '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
;
ЛЮБОЙ помощь/совет будет большой. Я пробовал читать десятки учебных пособий, и ничего о генерации АСТ, похоже, не придерживается :(
Это часть, которую я потерял, я боюсь. Я прочитал страницу по строительству деревьев и не очень понял ее :( –
Спасибо за редактирование. Это добавило много полезной информации. –
Действительно отличное объяснение. Я также начинаю с ANTLR, и я считаю, что сайт каким образом можно сказать, что вы купили книгу. Спасибо – INS