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

时间:2011-08-16 17:58:40

标签: unicode char antlr lexer antlrworks

两个问题:
1.为什么字符串abäcd无法识别(ANTLRWorks 1.4.2),语法如下(结果只有abcd,这意味着缺少德语变异元音ä?登记/> 2.我如何划分VowelsVowelsUpper中的VowelsLower并在规则Vowels中使用这两个规则?

grammar Vowels1a;

CharLower
  : 'a'..'z'
  ;

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

test
  : ( CharLower | Vowels )+
  ;

2 个答案:

答案 0 :(得分:2)

  

ANTLRStarter写道:

     

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规则(VowelsUpperVowelsLower),让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'参数。