2

2 つの質問:
1.abäcd以下の文法で文字列が認識されない (ANTLRWorks 1.4.2) のはなぜですか (結果はabcd、ドイツ語の変異母音äが欠落していることを意味します)。2. rule で両方の規則を分割して使用する
にはどうすればよいですか?VowelsVowelsUpperVowelsLowerVowels

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) の両方が、次の解析ツリーを生成します。

ここに画像の説明を入力

また、小規模な手動テストでも次のことが示されています。

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

母音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 で母音を分割し、規則母音で両方の規則を使用するにはどうすればよいですか?

fragment2 つのルール (VowelsUpperおよびVowelsLower) を作成し、これらのVowels両方を一致させます。fragment

Vowels
 : VowelsUpper
 | VowelsLower
 ;

fragment VowelsUpper
 : 'Ä'| 'Ö' | 'Ü'
 ;

fragment VowelsLower
 : 'ä' | 'ö' | 'ü'
 ;

fragmentパーサー ルールでルールを使用することはできず、他のレクサー ルールからのみルールを使用することに注意してください。

于 2011-08-16T18:36:21.113 に答える
0

質問1について:それはエンコーディングの問題に非常によく似ています。「6162E463 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」引数があります。

于 2011-08-29T20:36:19.883 に答える