Лексер и Юникод, например, немецкий мутированный гласный - PullRequest
2 голосов
/ 16 августа 2011

Два вопроса:
1. Почему строка abäcd не распознана (ANTLRWorks 1.4.2) с приведенной ниже грамматикой (результат только abcd, что означает, что немецкий мутировавший гласный ä отсутствует)?
2. Как я могу разделить Vowels на VowelsUpper и VowelsLower и использовать оба правила в правиле Vowels?

grammar Vowels1a;

CharLower
  : 'a'..'z'
  ;

Vowels
  : 'ä' | 'ö' | 'ü' | 'Ä'| 'Ö' | 'Ü'
  ;

test
  : ( CharLower | Vowels )+
  ;

Ответы [ 2 ]

2 голосов
/ 16 августа 2011

ANTLRSстартер писал:

1.Почему строка abäcd не распознается (ANTLRWorks 1.4.2) с приведенной ниже грамматикой (результат только abcd, это означает, что в нем отсутствует мутировавший гласный немецкий ä?

Я не мог воспроизвести это. ОбаИнтерпретатор и отладчик ANTLRWorks (1.4.2) создают следующее дерево разбора:

enter image description here

И небольшой ручной тест также показывает это:

Main.java

import org.antlr.runtime.*;

public class Main {
  public static void main(String[] args) throws Exception {
    Vowels1aLexer lexer = new Vowels1aLexer(new ANTLRStringStream("abäcd"));
    Vowels1aParser parser = new Vowels1aParser(new CommonTokenStream(lexer));
    parser.test();
  }
}

Vowels1a.g

grammar Vowels1a;

test
 : ( CharLower {System.out.println("CharLower :: " + $CharLower.text);}
   | Vowels    {System.out.println("Vowels    :: " + $Vowels.text);}
   )+
 ;

CharLower
 : 'a'..'z'
 ;

Vowels
 : 'ä' | 'ö' | 'ü' | 'Ä'| 'Ö' | 'Ü'
 ;

И для запуска демо:

java -cp antlr-3.3.jar org.antlr.Tool Vowels1a.g 
javac -cp antlr-3.3.jar *.java
java -cp .:antlr-3.3.jar Main

, который будет печатать:

CharLower :: a
CharLower :: b
Vowels    :: ä
CharLower :: c
CharLower :: d

ANTLRStarter писал:

2. Как разделить гласные в VowelsUpper и VowelsLower и использовать оба правила в гласных правилах?

Создать два fragment правила(VowelsUpper и VowelsLower) и пусть Vowels соответствуют обоим этим fragment s:

Vowels
 : VowelsUpper
 | VowelsLower
 ;

fragment VowelsUpper
 : 'Ä'| 'Ö' | 'Ü'
 ;

fragment VowelsLower
 : 'ä' | 'ö' | 'ü'
 ;

Имейте в виду, что вы не можете использовать правила fragment в ваших правилах синтаксического анализатора, только от другого лексераправила!

0 голосов
/ 30 августа 2011

По вопросу 1: Это пахнет очень похоже на проблему кодирования. «61 62 E4 63 64» означает, что файл закодирован с использованием iso-8859-1 (или этого варианта Windows-что-то). ANTLRWorks, похоже, использует utf-8, и я не вижу очевидного способа изменить это.

Полагаю, вы запустили отладчик с этим файлом в качестве входных данных. При сохранении файла как utf-8, он отлично работает для меня, а с iso-8859-1 «ä» отсутствует. Я не могу воспроизвести ошибку NoViableAlt в ANTLRWorks 1.4.3, кажется, что 'ä' просто отсутствует во входном потоке - возможно, декодер java utf8 молча пропускает недопустимые последовательности ...

Если вы создаете собственное приложение, вы можете указать, какую кодировку использует входной поток / файл. В Python ANTLRFileStream / ANTLRInputStream имеют удобный аргумент «кодирования» по этой причине.

...