java anltr 表达式转换_Java-ANTLR,表达式语法有问题

A1

否,还不需要回溯.但是,如果确实需要一些回溯,建议不要立即使用backtrack = true,而应在确实需要回溯的规则之前使用谓词.通过使用backtrack = true,可以对所有规则启用回溯,而可能只有一两个需要回溯.但是,如果您的语言相对较小,则backtrack = true比手工混合谓词更容易,并且可能不会对性能产生重大影响.但是,如果可以避免,请这样做.

您有几个解析器规则匹配空字符串,这会导致问题.通常,最好让规则匹配某些内容,并将规则设置为可选.所以代替:

foo : bar baz ;

bar : 'bar' ;

baz : 'baz' | /* epsilon */ ;

foo : bar baz? ;

bar : 'bar' ;

baz : 'baz' ;

代替.

另外,在使用诸如true,false等保留关键字的情况下,请不要在解析器规则中混合使用它们:始终在词法分析器规则的顶部明确定义它们. Lexer规则是从上到下匹配的,因此(至少)最安全地定义它们(例如ID)也可以匹配它们.我通常把它们作为第一个词法分析器规则.

A2

您可以通过将参数传递给解析器规则来做到这一点,尽管这样会使语法(有点)的可读性降低.

您的语法和我的评论:

grammar test;

options {

output=AST;

}

tokens {

ARRAY_EXPR;

}

start : expression;

expression : andExp;

andExp : cmpExp (And^ cmpExp)*;

cmpExp : sumExp (LessThan^ sumExp)*;

sumExp : prodExp ((Plus | Minus)^ prodExp)*;

prodExp : unaryExp (Times^ unaryExp)*;

unaryExp : '-' primaryExp

| '!' primaryExp // negation is really a `unaryExp`

| primaryExp

;

primaryExp : INT primaryPrime[null]?

| 'true' primaryPrime[null]?

| 'false' primaryPrime[null]?

| 'this' primaryPrime[null]?

| (ID -> ID) (primaryPrime[new CommonTree($ID)] -> primaryPrime)?

| '('! expression ')'! primaryPrime[null]?

;

// removed the matching of 'epsilon'

primaryPrime [CommonTree parent]

: '[' expression ']' primaryPrime[null]? -> ^(ARRAY_EXPR {parent} expression primaryPrime?)

| '.' ID '(' exprList? ')' primaryPrime[null]?

| '.length' primaryPrime[null]?

| 'new' 'int' '[' expression ']' primaryPrime[null]?

| 'new' ID '(' ')' primaryPrime[null]?

;

// removed the matching of 'epsilon'

exprList : expression (',' expression)*;

// be sure to create explicit tokens for keywords!

True : 'true';

False : 'false';

This : 'this';

LessThan : '

Plus : '+';

Minus : '-';

Times : '*';

And : '&&';

Not : '!';

INT : '0' | ('1'..'9')('0'..'9')*;

ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;

WS : ('' | ' ' | '' | '

'| '') { $channel=HIDDEN; } ;

会将输入“ array [2 * 3]”解析为以下AST:

如您所见,通过运行以下测试类:

import org.antlr.runtime.*;

import org.antlr.runtime.tree.*;

import org.antlr.stringtemplate.*;

public class Main {

public static void main(String[] args) throws Exception {

String source = "array[2*3]";

testLexer lexer = new testLexer(new ANTLRStringStream(source));

CommonTokenStream tokens = new CommonTokenStream(lexer);

testParser parser = new testParser(tokens);

testParser.start_return returnValue = parser.start();

CommonTree tree = (CommonTree)returnValue.getTree();

DOTTreeGenerator gen = new DOTTreeGenerator();

StringTemplate st = gen.toDOT(tree);

System.out.println(st);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值