2

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

grammar Vowels1a;

CharLower
  : 'a'..'z'
  ;

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

test
  : ( CharLower | Vowels )+
  ;
4

2 回答 2

2

ANTLRStarter 写道:

1. 为什么使用以下语法无法识别字符串 abäcd(ANTLRWorks 1.4.2)(结果只有 abcd,这意味着缺少德语变异元音 ä?

我无法重现这一点。ANTLRWorks 的解释器和调试器 (1.4.2) 都生成以下解析树:

在此处输入图像描述

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

主.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();
  }
}

元音1a.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在解析器规则中使用规则,只能使用其他词法分析器规则!

于 2011-08-16T18:36:21.113 回答
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 有一个方便的“编码”参数。

于 2011-08-29T20:36:19.883 回答