如何获取跳过的空格(原始令牌而不跳过)?

时间:2016-09-05 03:05:11

标签: java antlr4 dsl

G4:

grammar KBDP;
WS: [\r\n \t] -> skip;

VARNAME:[_a-zA-Z0-9]+;
OP:[='*,.];
REALVAR:'@' VARNAME; 

prog:sqlsentece+;
sqlsentece:'"' (VARNAME|OP|REALVAR)+'"';

原始sql:

  

“从myTables中选择*”

public void enterSqlsentece(KBDPParser.SqlsenteceContext ctx) 
    { 
        ctx.getText();
    }

ctx.getText()返回令牌跳过的空白

  

“SELECT * frommyTables”

如何获取原始sql“select * from myTables”(带空格)?

1 个答案:

答案 0 :(得分:1)

每个解析上下文都有一个开始和结束标记,它指向包含该上下文的标记。除了其他属性之外,令牌还具有开始+结束索引,这些索引指示原始源流中的字符偏移量。使用相关的CharStream及其getText(Interval(from,to));获取上下文的原始文本的方法。

示例:

public void enterSqlsentece(KBDPParser.SqlsenteceContext ctx) 
{
  CharStream cs = ctx.start.getTokenSource().getInputStream();
  String originalText = cs.getText(Interval.of(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
}