无法使用 ANTLR 解析 APL 符号

Unable to parse APL Symbol using ANTLR

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

表达式=N←0

词法分析器

/* 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"用于生成token
  1. "grun.bat" is used to generate token

那只能说明你的终端无法正常显示字符。生成的解析器或词法分析器无法识别 .

没有任何问题

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

像这样:

grammar T;

expression
 : ID ARROW NUMBER
 ;

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

和一个主要 class:

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 class:

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)