Get original text of an Antlr rule

前端 未结 1 1312
逝去的感伤
逝去的感伤 2020-12-17 01:28

I am an ANTLR beginner and want to calculate a SHA1-Hash of symbols.

My simplified example grammar:

grammar Example;

method @after{calculateSha1($te         


        
1条回答
  •  悲&欢浪女
    2020-12-17 02:21

    Instead of skip()-ping the WS token, put it on the HIDDEN channel as well:

    grammar Example;
    
    @parser::members {
      void calculateSha1(String text) {
        try {
          java.security.MessageDigest md = java.security.MessageDigest.getInstance("SHA-1");
          byte[] sha1 = md.digest(text.getBytes());
          System.out.println(text + "\n" + java.util.Arrays.toString(sha1) + "\n");
        } catch(Exception e) {
          e.printStackTrace();
        }
      }
    }
    
    parse 
      :  method+ EOF
      ;
    
    method
    @after{calculateSha1($text);}
      :  'call' ID
      ;
    
    ID      : 'A'..'Z'+;
    WS      : (' ' | '\t' | '\n' | '\r')+ {$channel=HIDDEN;};
    COMMENT : '/*' .* '*/' {$channel=HIDDEN;};
    

    The grammar above can be tested with:

    import org.antlr.runtime.*;
    
    public class Main {
      public static void main(String[] args) throws Exception {
        String source = "call ABC call /* DEF */ ABC";
        ExampleLexer lexer = new ExampleLexer(new ANTLRStringStream(source));
        ExampleParser parser = new ExampleParser(new CommonTokenStream(lexer));
        parser.parse();
      }
    }
    

    which will print the following to the console:

    call ABC
    [48, -45, 113, 5, -52, -128, -78, 75, -52, -97, -35, 25, -55, 59, -85, 96, -58, 58, -96, 10]
    
    call /* DEF */ ABC
    [-57, -2, -115, -104, 77, -37, 4, 93, 116, -123, -47, -4, 33, 42, -68, -95, -43, 91, 94, 77]

    i.e.: the same parser rule, yet different $text's (and therefor different SHA1's).

    0 讨论(0)
提交回复
热议问题