ANTLRSстартер писал:
1.Почему строка abäcd не распознается (ANTLRWorks 1.4.2) с приведенной ниже грамматикой (результат только abcd, это означает, что в нем отсутствует мутировавший гласный немецкий ä?
Я не мог воспроизвести это. ОбаИнтерпретатор и отладчик ANTLRWorks (1.4.2) создают следующее дерево разбора:
И небольшой ручной тест также показывает это:
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
в ваших правилах синтаксического анализатора, только от другого лексераправила!