作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试学习语言解析的乐趣......
我已经创建了一个 ANTLR 语法,我相信它会匹配我希望实现的简单语言。它将具有以下语法:
<FunctionName> ( <OptionalArguments>+) {
<OptionalChildFunctions>+
}
ForEach(in:[1,2,3,4,5] as:"nextNumber") {
Print(message:{nextNumber})
}
FunctionName
/ \
Attributes \
/ \ / \
ID /\ ChildFunctions
/ \ ID etc
/ \
Attribute AttributeValue
Type
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'|'\"'|'\''|'\\')
;
最佳答案
第 1 步是使树看起来像您张贴的小图。现在,您没有任何树构造运算符,因此您最终会得到一个平面列表。
见 tree construction在 antlr.org 网站上。
您可以使用 ANTLRWorks看看你从解析树和 AST 中得到了什么。开始添加树构造运算符并观察情况如何变化。
编辑/附加信息:
您可以按照以下流程大致了解如何操作:
!
它告诉编译器不要将节点放置在 AST 中,并且胡萝卜 ^
,它告诉 ANTLR 使某些东西成为根节点。首先检查每个非终结符规则并决定哪些元素不需要在 AST 中。例如,您不需要逗号或括号。获得所有信息后,您可以填充提供所有信息的结构(或创建您自己的 AST 结构)。逗号不再有用,所以添加 !
给他们。例如:function: ID (OPEN_BRACKET! (attribute (COMMA!? attribute)*)? CLOSE_BRACKET!)? (OPEN_BRACE! function* CLOSE_BRACE!)?;
ID
作为根节点,所以添加一个 ^
之后 ID
并在 ANTLRWorks 中进行比较。 program : function ;
function : ID^ (OPEN_BRACKET! attributeList? CLOSE_BRACKET!)? (OPEN_BRACE! function* CLOSE_BRACE!)?;
attributeList: (attribute (COMMA!? attribute)*);
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!;
关于antlr - 如何在 ANTLR3 中制作 TreeParser?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2061166/
我正在尝试学习语言解析的乐趣...... 我已经创建了一个 ANTLR 语法,我相信它会匹配我希望实现的简单语言。它将具有以下语法: ( +) { + } 实际示例: ForEach(i
我正在尝试获取 ANTLR3 树语法中的行号(ANTLR3 生成的代码属于 TreeParser 类)。 谷歌只找到了 ANTLR2 的解决方案,遗憾的是在 ANTLR3 中不起作用。 澄清一下,我正
我是 ANTLR 的新手,我正在尝试使用 C 目标在 ANTLR3 中创建一个规则评估器。我正在使用最新版本的 ANTLR3 (3.5.2) 和 Java 1.7.0.80 来生成代码。 我可以毫无问
我是一名优秀的程序员,十分优秀!