无法使用 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 语言中的特殊字符。
我正在按照以下步骤操作。
- 书面语法
- "antlr4.bat" 用于从语法生成解析器。
- "grun.bat"用于生成token
- "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)
我正在尝试使用 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 语言中的特殊字符。
我正在按照以下步骤操作。
- 书面语法
- "antlr4.bat" 用于从语法生成解析器。
- "grun.bat"用于生成token
- "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)