Lexer和unicode,例如德语变异元音

Lexer和unicode,例如德语变异元音,unicode,char,antlr,lexer,antlrworks,Unicode,Char,Antlr,Lexer,Antlrworks,两个问题: 1.为什么字符串abäcd无法识别(ANTLRWorks 1.4.2)和下面的语法(结果只是abcd,这意味着德语变异元音ä缺失)? 2.如何在元音上部和元音下部中划分元音,并在规则元音中使用这两个规则 grammar Vowels1a; CharLower : 'a'..'z' ; Vowels : 'ä' | 'ö' | 'ü' | 'Ä'| 'Ö' | 'Ü' ; test : ( CharLower | Vowels )+ ; AntlStar

两个问题:
1.为什么字符串
abäcd
无法识别(ANTLRWorks 1.4.2)和下面的语法(结果只是
abcd
,这意味着德语变异元音
ä
缺失)?
2.如何在
元音上部
元音下部
中划分
元音
,并在规则
元音
中使用这两个规则

grammar Vowels1a;

CharLower
  : 'a'..'z'
  ;

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

test
  : ( CharLower | Vowels )+
  ;
AntlStarter写道:

一,。为什么字符串abäcd无法识别(ANTLRWorks 1.4.2)和下面的语法(结果只是abcd,这意味着德语变异元音缺失)

我无法复制此内容。AntlWorks的解释器和调试器(1.4.2)都会生成以下解析树:

一个小型手动测试也显示了这一点:

主类
import org.antlr.runtime.*;
公共班机{
公共静态void main(字符串[]args)引发异常{
元音s1alexer lexer=新元音s1alexer(新的antlStringStream(“abäcd”);
元音ls1aparser parser=新元音ls1aparser(新的CommonTokenStream(lexer));
test()语法分析器;
}
}
元音1A.g
语法元音ls1a;
测试
:(CharLower{System.out.println(“CharLower::”+$CharLower.text);}
|元音{System.out.println(“元音::”+$vouels.text);}
)+
;
查尔洛
:'a'…'z'
;
元音
: 'ä' | 'ö' | 'ü' | 'Ä'| 'Ö' | 'Ü'
;
要运行演示,请执行以下操作:

java-cp antlr-3.3.jar org.antlr.Tool元音ls1a.g
javac-cp antlr-3.3.jar*.java
java-cp.:antlr-3.3.jar Main
将打印:

CharLower::a
夏洛:b
元音::ä
查尔洛::c
查尔洛::d
AntlStarter写道:

2.如何划分元音上限和元音下限中的元音,并在规则元音中同时使用这两个规则

创建两个
片段
规则(
元音上部
元音下部
),并让
元音
与这两个
片段
匹配:

元音
:元音上限
|元音歌手
;
片段元音上部
: 'Ä'| 'Ö' | 'Ü'
;
片段元音
: 'ä' | 'ö' | 'ü'
;
请注意,您不能在解析器规则中使用
片段
规则,只能使用其他lexer规则!

关于问题1: 这听起来很像是一个编码问题。“61 62 E4 63 64”意味着该文件是使用iso-8859-1(或windows的某个变体)编码的。AntlWorks似乎使用utf-8,我看不到明显的方法来改变这一点

我假设您使用该文件作为输入运行调试器。当将该文件保存为utf-8时,它对我来说运行良好,而对于iso-8859-1,“ä”缺失。我无法重现AntlWorks 1.4.3中的NoviableAllt错误,“ä”似乎只是从输入流中缺失-也许java的utf8解码器会悄悄地跳过无效序列


如果您构建自己的应用程序,您可以指定输入流/文件使用的编码。在Python中,ANTLRFileStream/AntlInputstream有一个方便的“encoding”参数用于此原因。

Bart,再次感谢-真的很奇怪。使用AntlWorks调试器再次尝试-同样的问题。明天我将使用解释器进行尝试。我看到了ANTLRWorks在语法末尾添加了一些垃圾字节,导致语法出现异常响应。请尝试在普通文本编辑器中打开语法,查看末尾是否有一些奇数字节(并将其删除)。如果仍然是一样的,请使用
Main
类尝试我的命令行演示:那一定有用。@AntlStarter,我也扩展了我的答案,我错过了你的第二个问题。是的,多亏了你的另一个答案,我意识到了这个问题。因此我在十六进制模式下检查奇怪的语法。调试器输出抱怨
Test\u input.txt行1:2字符“?”
CharLower::a
之后没有可行的替代方案。在十六进制模式下也检查了
Test_input.txt
abäcd
在十六进制
61 62 E4 63 64
中。演示也很有效。只是在AntlWorks 1.4.3中尝试了它,同样的问题。Ben,非常感谢您的努力-我只是使用了输入文本字段和
a调试器中的bäcd
。现在使用AntlWorks 1.4.2和1.4.3再次检查它。如前所述存在问题(但现在没有错误消息)。使用我的文件时,来自Bart的Java演示可以工作(编码
61 62 E4 63 64
)。