无法使用ANTLR

时间:2018-03-08 14:12:17

标签: antlr apl

我正在尝试使用ANTLR解析APL表达式,它是一种APL源代码解析器。它解析普通字符,但无法解析特殊符号(如'←')

表达式= N←0

Lexer

/* Lexer Tokens. */

NUMBER:    
 (DIGIT)+ ( '.' (DIGIT)+ )?;

ASSIGN:
    '←'
    ;

DIGIT : 
    [0-9]
    ;

输出:

[@0,0:1='99',<NUMBER>,1:0]
**[@1,4:6='â??',<'â??'>,2:0**]
[@2,7:6='<EOF>',<EOF>,2:3]

有人可以帮我解析APL语言中的特殊字符。

我正在按照以下步骤操作。

  1. 书面语法
  2. “antlr4.bat”用于从语法生成解析器。
  3. “grun.bat”用于生成令牌

1 个答案:

答案 0 :(得分:2)

  
      
  1. “grun.bat”用于生成令牌
  2.   

这意味着您的终端无法正常显示该字符。生成的解析器或词法分析器无法识别

只是不要使用bat文件,而是通过使用自己喜欢的IDE(可以正确显示字符)自己编写一个小类来测试lexer和解析器。

这样的事情:

grammar T;

expression
 : ID ARROW NUMBER
 ;

ID     : [a-zA-Z]+;
ARROW  : '←';
NUMBER : [0-9]+;
SPACE  : [ \t\r\n]+ -> skip;

和一个主要类:

import org.antlr.v4.runtime.*;

public class Main {
  public static void main(String[] args) {
    TLexer lexer = new TLexer(CharStreams.fromString("N ← 0"));
    TParser parser = new TParser(new CommonTokenStream(lexer));
    System.out.println(parser.expression().toStringTree(parser));
  }
}

将显示:

(expression N ← 0)

修改

你也可以尝试使用这个箭头的unicode转义符:

grammar T;

expression
 : ID ARROW NUMBER
 ;

ID     : [a-zA-Z]+;
ARROW  : '\u2190';
NUMBER : [0-9]+;
SPACE  : [ \t\r\n]+ -> skip;

和Java类:

import org.antlr.v4.runtime.*;

public class Main {
  public static void main(String[] args) {
    String source = "N \u2190 0";
    TLexer lexer = new TLexer(CharStreams.fromString(source));
    TParser parser = new TParser(new CommonTokenStream(lexer));
    System.out.println(source + ": " + parser.expression().toStringTree(parser));
  }
}

将打印:

N ← 0: (expression N ← 0)