1

将来、ドメイン固有言語(DSL)を実装するために、ANTLRの学習を始めました。私はTheDefinitiveANTLR Referenceを購入し、プログラムと言語/コンパイラー設計の概念に慣れるために、それを読み始めました。私は自分の環境(Visual Studio 2010およびC#)内ですべてが正常に機能するようになり、本全体で説明されているように、いくつかの基本的な文法を正常に作成できました。Javaのソースコードはここにあります:http://pragprog.com/titles/tpantlr/source_code

しかし、第3章を読んでいるときに、本に示されているように、クラスがコンソールにエラーを出力しないという問題に遭遇しました。この本で使用されているのと同じ文法を使用しているので、C#ランタイムと関係があると思います。現在、ANTLRWorksを使用してレクサー/パーサーを生成しており、CSharp3用の3.4 ANTLR配布ランタイム(Antlr3.Runtime.dllおよびAntlr4.StringTemplate.dll)を使用しています。

これは既知の問題ですか?そうでない場合は、古いバージョンのランタイムまたはANTLRWorksを使用してみてください。

私が使用している文法:

grammar Expr;

options
{
   language = CSharp3;
}

prog    :   stat+ ;

stat    :   expr NEWLINE
|   ID '=' expr NEWLINE
|       NEWLINE
;

expr    :   multExpr (('+'|'-') multExpr)*
;

multExpr 
:   atom('*' atom)*
;

atom    :   INT
|   ID
|   '(' expr ')'
;

ID  :   ('a'..'z'|'A'..'Z')+ ;
INT :   '0'..'9'+ ;
NEWLINE :   '\r'? '\n';
WS  :   (' '|'\t')+ {Skip();};

誰かが見る必要がある場合はC#クラスを投稿しますが、非常に長いので、誰かが要求するまで延期します。ありがとうございました。

4

2 に答える 2

4

3.4.1.9004ソースコードでデバッグした後、traceDestinationプロパティがnullであることがわかりました。そこで、Main()で以下のようにプロパティを設定すると、コンソールにメッセージが表示され始めました。

parser.TraceDestination = Console.Out;

于 2012-02-24T02:31:57.743 に答える
1

私は、MonoDevelopを使用してUbuntuマシンでCSharp3ターゲットを実行することができなかったため、CSharp2ターゲット(およびランタイム)のみを使用しました。

ANTLRWorksを使用する場合、メモリが十分に機能する場合、CSharp3ランタイムで(時々?)問題が発生するクラスとクラスorg.antlr.Toolを生成するために使用されます。ExprLexer.csExprParser.cs

代わりに、ツールを使用して.csソースファイルを生成してみてください: http : //www.tunnelvisionlabs.com/downloads/antlr/antlr-dotnet-tool-3.4.1.9004.7z(tunnelvisionlabs.comはCSharp3ターゲットの作成によるものであることに注意してください) 。Antlr3.exe

CSharp3ターゲットに慣れていないため、これはテストしていませんが、試してみる価値はあります。

于 2011-12-15T19:07:43.677 に答える