Невозможно проанализировать символ 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.

Я следую ниже шагов.

  1. Письменная грамматика
  2. "antlr4.bat" используется для генерации парсера из грамматики.
  3. "grun.bat" используется для генерации токена

1 ответ

Решение
  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)
Другие вопросы по тегам