Заменить токен в ANTLR - PullRequest
       11

Заменить токен в ANTLR

2 голосов
/ 26 марта 2012

Я хочу заменить токен с помощью ANTLR.

Я пытался использовать TokenRewriteStream и заменить, но он не работал.

Есть предложения?

  ANTLRStringStream in = new ANTLRStringStream(source);
  MyLexer lexer = new MyLexer(in);
  TokenRewriteStream tokens = new TokenRewriteStream(lexer);
  for(Object obj : tokens.getTokens()) {
     CommonToken token = (CommonToken)obj;  
     tokens.replace(token, "replacement");
  }

Лексер находит все вхождения однострочных комментариев, и я хочу заменить их и в оригинальном источнике.

РЕДАКТИРОВАТЬ:

Это грамматика:

grammar ANTLRTest;

options {
  language = Java;
}

@header {
  package main;
}

@lexer::header {
  package main;
}

rule: SingleLineComment+;

SingleLineComment
  :  '//' ~( '\r' | '\n' )* {setText("replacement");}
    ;

То, что я хочу сделать, это заменить все однострочные комментарии в файле, скажем.

1 Ответ

4 голосов
/ 27 марта 2012

Переписать текст внутри лексера:

SingleLineComment
 : '//' ~('\r' | '\n')* {setText("replacement");}
 ;

EDIT

Хорошо, вот небольшая демонстрация того, как вы можете отфильтровать определенные токены из языка:

SingleCommentStrip.g

grammar SingleCommentStrip;

parse returns [String str]
@init{StringBuilder builder = new StringBuilder();}
 : (t=. {builder.append($t.text);})* EOF {$str = builder.toString();}
 ;

SingleLineComment
 : '//' ~('\r' | '\n')* {skip();}
 ;

MultiLineComment
 : '/*' .* '*/'
 ;

StringLiteral
 : '"' ('\\' . | ~('"' | '\\' | '\r' | '\n'))* '"'
 ;

AnyOtherChar
 : .
 ;

Main.java

import org.antlr.runtime.*;

public class Main {
  public static void main(String[] args) throws Exception {
    SingleCommentStripLexer lexer = new SingleCommentStripLexer(new ANTLRFileStream("Test.java"));
    SingleCommentStripParser parser = new SingleCommentStripParser(new CommonTokenStream(lexer));
    String adjusted = parser.parse();
    System.out.println(adjusted);
  }
}

Test.java

// COMMENT
class Test {
  /*
  // don't remove
  */
  // COMMENT AS WELL
  String s = "/* don't // remove */ \" \\ me */ as well";
}

Теперь запустите демо:

java -cp antlr-3.3.jar org.antlr.Tool SingleCommentStrip.g
javac -cp antlr-3.3.jar *.java
java -cp .:antlr-3.3.jar Main

который напечатает:


class Test {
  /*
  // don't remove
  */

  String s = "/* don't // remove */ \" \\ me */ as well";
}

(т.е. однострочные комментарии удаляются)

...