ANTLR表达式解释器

ANTLR表达式解释器,antlr,antlr3,Antlr,Antlr3,我已经创建了以下语法:我想知道如何构建一个用java返回树的解释器,稍后我可以用它在屏幕上打印,Im位堆栈如何开始 grammar myDSL; options { language = Java; } @header { package DSL; } @lexer::header { package DSL; } program : IDENT '={' components* '}' ; components : IDENT '=('(shap

我已经创建了以下语法:我想知道如何构建一个用java返回树的解释器,稍后我可以用它在屏幕上打印,Im位堆栈如何开始

grammar myDSL;

options {
  language = Java;
}
@header {
  package DSL;
}
@lexer::header {
  package DSL;
}


program
    :  IDENT '={' components* '}'
    ;


components
    : IDENT '=('(shape)(shape|connectors)* ')'
    ;

shape
    :  'Box' '(' (INTEGER ','?)* ')'
    |  'Cylinder' '(' (INTEGER ','?)* ')'
    |  'Sphere' '(' (INTEGER ','?)* ')'
    ;

connectors
    :  type '(' (INTEGER ','?)* ')'
    ;    

type
    :  'MG'
    |  'EL'
    ;

IDENT: ('a'..'z' | 'A'..'Z')('a'..'z' | 'A'..'Z' | '0'..'0')*;

INTEGER: '0'..'9'+;

// This if for the empty spaces between tokens and avoids them in the parser
WS: (' ' | '\t' | '\n' | '\r' | '\f')+ {$channel=HIDDEN;};

COMMENT: '//' .* ('\n' | '\r') {$channel=HIDDEN;};
几句话:

不需要为Java设置语言,这是默认的目标语言。因此,您可以删除以下内容:

options {
  language = Java;
}
您的
IDENT
包含错误:

IDENT: ('a'..'z' | 'A'..'Z')('a'..'z' | 'A'..'Z' | '0'..'0')*;
'0'..'0')
最有可能是
'0'..'9')

子规则
(整数','?)*
也匹配源代码,如
1234
(根本没有逗号!)。也许你的意思是:
(整数(','INTEGER)*)?

现在,关于你的问题:如何让ANTLR构造一个合适的AST?这可以通过添加
output=AST在选项块中:

options {
  //language = Java;
  output = AST;
}
然后添加“树运算符”
^
在解析器规则中,或通过使用树重写规则:
规则:abc->^(cba)

“树运算符”
^
用于定义(子)树的根和
用于从(子)树中排除令牌

重写规则具有
^(/*标记,此处为*/)
,其中第一个标记(紧跟在
^(
)之后)是(子)树的根,并且以下所有标记都是根的子节点

举个例子吧。让我们看看你的第一条规则:

program
  :  IDENT '={' components* '}'
  ;
您希望让
IDENT
作为根,
组件*
作为子项,并希望从树中排除
={
}
。您可以通过执行以下操作:

program
  :  IDENT^ '={'! components* '}'!
  ;
program
  :  IDENT '={' components* '}' -> ^(IDENT components*)
  ;
或通过以下方式:

program
  :  IDENT^ '={'! components* '}'!
  ;
program
  :  IDENT '={' components* '}' -> ^(IDENT components*)
  ;