Невозможно проанализировать символ APL с помощью ANTLR
Я пытаюсь проанализировать выражения APL с помощью ANTLR, это своего рода анализатор исходного кода 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" используется для генерации токена
1 ответ
- "grun.bat" используется для генерации токена
Это означает, что ваш терминал не может правильно отображать персонажа. Нет ничего плохого в том, что сгенерированный парсер или лексер не могут распознать ←
,
Просто не используйте файл bat, а просто протестируйте свой лексер и анализатор, написав небольшой класс самостоятельно, используя вашу любимую IDE (которая может правильно отображать символы).
Что-то вроде этого:
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)
РЕДАКТИРОВАТЬ
Вы также можете попробовать использовать escape-кодировку 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)