2009-04-20 2 views
3

Я создаю грамматику с использованием JavaCC и сталкиваюсь с небольшой проблемой. Я пытаюсь разрешить любой допустимый символ в расширенном наборе ASCII, который должен быть распознан результирующим компилятором. После того, как смотреть на тех же примерах JavaCC (прежде всего пример, показывающий саму JavaCC Grammer) я создал следующий токен признать свои символы:Признание расширенных символов с использованием JAVACC

< CHARACTER: 

    ( (~["'"," ","\\","\n","\r"]) 
    | ("\\" 
     (["n","t","b","r","f","\\","'","\""] 
     | ["0"-"7"] (["0"-"7"])? 
     | ["0"-"3"] ["0"-"7"] ["0"-"7"] 
     ) 
    ) 
) 

> 

Если я правильно понять это должно быть соответствие по восьмеричном представлении всех символов ASCII от 0-377 (который охватывает все 256 символов в расширенном наборе ASCII). Это выполняется как ожидается для всех символов клавиатуры (a-z, 0-9,?,./Etc) и даже для большинства специальных символов (©, ¬ ®). Однако, когда я пытаюсь разобрать символ «товарный знак» (™), мой анализатор постоянно выдает исключение «Конец файла», что указывает на то, что он не может распознать символ. Есть ли какой-то очевидный способ, чтобы я мог улучшить свое определение персонажа, чтобы можно было принять символ товарного знака?

ответ

1

Оказалось, что то, что я хотел, чтобы моя грамматика выполняла, заключалась в том, чтобы принять все допустимые символы Юникода, а не символы ASCII, символ ™ является частью спецификации Юникода, а не расширенным набором символов ASCII. Изменение моих маркеров для действительного характера, изложенные ниже решить мою проблему: (Действительный юникод бытие Формат- U + 00FF)

< CHARACTER:( (~["'"," ","\\","\n","\r"]) 
| ("\\" 
    (["n","t","b","r","f","\\","'","\""] 
    | ["u","U"]["+"]["0"-"9","a"-"f","A"-"F"]["0"-"9","a"-"f","A"-"F"]["0"-"9","a"-"f","A"-"F"]["0"-"9","a"-"f","A"-"F"] 
    ) 
))> 
0

Я имел подобную проблему с признанием специальных символов текстового файла (или кодировка CP1252 или ISO-8859-1), который был прочитан в String перед синтаксическим разбором. Мое решение было добавление UNICODE_INPUT к заголовку грамматик:

options { 
    UNICODE_INPUT=true; 
} 

Работали, как ветер.

Дополнительная информация о вариантах JavaCC: http://javacc.java.net/doc/javaccgrm.html

Смежные вопросы