Грамматика ANTLR: понимание символа евро CP1252

Моя грамматика проста, но я хочу, чтобы она принимала некоторые строки для конкатенации. Эта формула должна быть действительной:

CONCATENATE(10;" €" )

Проблема в том, что символ евро. Раньше я использовал это в своей грамматике, это очень хорошо работало для символа степени:

fragment SPECIAL        :   '\u00B0';

Но символ евро работает не так, как этот символ градуса:

fragment SPECIAL        :   '\u00B0' | '\u20AC'

Я создаю синтаксический анализатор PHP с ANTLR 3.4, и сгенерированный код лексера для символа степени следующий:

$this->getToken('176')== $LA26 || ...

И он должен рекламировать это для символа евро. Если я добавлю его вручную после генерации парсера (есть 2 места для добавления), он будет работать!

$this->getToken('128')== $LA26 || ...

Мой вопрос: как добавить это в грамматику, чтобы получить генерацию этого кода? Есть ли проблема с этим диапазоном символов Юникода, начиная с чего-то wlse, чем u00 ... потому что все мои другие СПЕЦИАЛЬНЫЕ символы начинаются с \ u00

Большое спасибо за время, проведенное со мной. С уважением, Николас.


person Nicolas Thery    schedule 11.09.2017    source источник
comment
Кодируйте ВСЕ как UTF-8!   -  person delboy1978uk    schedule 11.09.2017
comment
пожалуйста, прекратите троллинг, antlr php не поддерживает utf8   -  person Nicolas Thery    schedule 11.09.2017
comment
ой! В самом деле?! никакого троллинга, друг мой!   -  person delboy1978uk    schedule 11.09.2017
comment
comment
@ delboy1978uk, этот вопрос касается ANTLR 4 - не уверен, что это актуально.   -  person Jiri Tousek    schedule 11.09.2017
comment
Пользуюсь Antlr 3, 4 другой   -  person Nicolas Thery    schedule 14.09.2017


Ответы (1)


Если ваш синтаксический анализатор использует ввод CP1252, как вы ожидаете, что он будет работать с токенами, определенными в терминах кодовых точек Unicode?

Если вводится CP1252, вам необходимо использовать кодовые точки этой кодировки. Используйте \u0080 для обозначения евро в CP1252.

person Jiri Tousek    schedule 11.09.2017
comment
Я попробую 0080. Но передача точек юникода работает для u00B0 символа степени или числа ... Вот почему я не могу понять, в чем проблема ... - person Nicolas Thery; 14.09.2017
comment
0xB0 - это код степени как в Unicode, так и в CP1252, что может быть причиной. - person Jiri Tousek; 14.09.2017