两个问题:
1.为什么字符串abäcd
无法识别(ANTLRWorks 1.4.2),语法如下(结果只有abcd
,这意味着缺少德语变异元音ä
?登记/>
2.我如何划分Vowels
和VowelsUpper
中的VowelsLower
并在规则Vowels
中使用这两个规则?
grammar Vowels1a;
CharLower
: 'a'..'z'
;
Vowels
: 'ä' | 'ö' | 'ü' | 'Ä'| 'Ö' | 'Ü'
;
test
: ( CharLower | Vowels )+
;
答案 0 :(得分:2)
ANTLRStarter写道:
1。为什么字符串abäcd无法识别(ANTLRWorks 1.4.2),语法如下(结果只是abcd,这意味着德语突变的元音ä丢失了?
我无法重现这一点。 ANTLRWorks的解释器和调试器(1.4.2)都生成以下解析树:
小手动测试也显示了这一点:
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();
}
}
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
匹配:
Vowels
: VowelsUpper
| VowelsLower
;
fragment VowelsUpper
: 'Ä'| 'Ö' | 'Ü'
;
fragment VowelsLower
: 'ä' | 'ö' | 'ü'
;
请注意,您不能在解析器规则中使用fragment
规则,只能使用其他词法分析器规则!
答案 1 :(得分:0)
关于问题1: 这闻起来很像编码问题。 “61 62 E4 63 64”表示使用iso-8859-1(或windows-something变体)对文件进行编码。 ANTLRWorks似乎使用utf-8,我认为没有明显的方法可以改变它。
我假设您使用该文件作为输入运行调试器。将文件保存为utf-8时,对我来说效果很好,而iso-8859-1则缺少'ä'。我无法在ANTLRWorks 1.4.3中重现NoViableAlt错误,'ä'似乎只是从输入流中丢失了 - 也许java的utf8解码器默默地跳过无效序列...
如果您构建自己的应用程序,则可以指定输入流/文件使用的编码。在Python中,ANTLRFileStream / ANTLRInputStream有一个方便的'encoding'参数。