我正在尝试使用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语言中的特殊字符。
我正在按照以下步骤操作。
答案 0 :(得分:2)
- “grun.bat”用于生成令牌
醇>
这意味着您的终端无法正常显示该字符。生成的解析器或词法分析器无法识别←
。
只是不要使用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)