問題タブ [antlr]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
antlr - ダミーの ANTLR および DSL 解析: 空白の処理
プロトタイピングに antlworks を使用して、ソフトウェア構成用のミニ DSL を開発しようとしています。典型的なソースは次のようになります。
現在、私は構文解析に関する正式なコースを受講したことがないため、antlworks の試行錯誤と BNF 文法のいくつかの基礎によって、これらすべてを行っています。私が遭遇する絶え間ない問題の 1 つは、空白と改行の処理です。私は次のようなものを定義しました
しかし、空白の処理は非常にバグが多く、あらゆる種類のケースで機能しなくなります。これを行う標準的な方法は何ですか?この種のことをすばやく学習するためのリソースはありますか (antlr で条件付き変数と変数を使用して電卓を構築するようなものです。私が見つけた antlr 文法は、自明で本格的な言語のいずれかです)。
java - Java 正規表現構文の ANTLR 文法
私は現在、正規表現のテスト フレームワークに取り組んでおり、指定された正規表現に一致するサンプル文字列を生成できるように、Java 正規表現を AST に解析できる必要があります。
の実装を見てみましたjava.util.regex.Pattern
が、コードは非常に扱いにくいように見えます (私が想像するように、読みやすさよりも速度に重点が置かれていました)。そのため、ANTLR を使用して正規表現パーサーをゼロから作成することにしました。
誰かが正規表現の準備ができている ANTLR 文法を知っているかどうか疑問に思っています。
return-value - ANTLR でリストの戻り値を処理する方法
ANTLRでこの問題を解決する正しい方法は何ですか:
単純な文法規則があります。たとえば、任意の数の要素を持つリストです。
リストの戻り値を割り当て、その値をプロダクションからの戻り値の実際のリストにしたい場合、それを行う適切な方法は何ですか? 私が楽しんでいる代替案は次のとおりです。
- これらのリストを追跡するために、グローバル スコープで独自のスタックを作成します
- 私の下のツリーノードを調べて、そのように情報を抽出してみてください
- ルールに関連付けられたアクション内からそのようなリストに簡単にアクセスできる方法を見つけたいと思っています。
問題は次のとおりだと思います。クールな子供たちはどのようにそれを行うのですか?
(参考までに、私はANTLRにpython APIを使用していますが、別の言語で私を襲った場合は、それを処理できます)
c++ - ANTLR パーサー ジェネレーターは、メモリに制約のある C++ アプリに最適ですか?
大規模な商用アプリでカスタム テキスト ファイル形式を読み取るために使用できる優れたパーサー ジェネレーターを探しています。現在、この特定のファイル形式は手作りの再帰パーサーで読み取られますが、その方法が管理不能になるまで、形式は成長し、複雑化しています。
究極の解決策は、この形式に適した文法を構築し、yacc のような実際のパーサー ジェネレーターを使用してそれを読み取ることのようですが、どのジェネレーターを使用するか、または問題を解決する価値があるかどうかを判断するのに苦労しています。まったく。私はANTLRとSpiritを見てきましたが、私たちのプロジェクトには以前の回答を超えた特定の制約があり、それらが私たちに適しているかどうか疑問に思います. 特に、次のものが必要です。
- MSVC で C または C++ コードを生成するパーサー。ANTLR 3 は C++ をサポートしていません。ストレートCを生成すると主張していますが、実際に動作させるためのドキュメントはちょっと混乱しています。
- メモリ使用量が大幅に制限されています。私たちのアプリではメモリが非常に重要であり、わずかなリークでも致命的です。カスタム malloc() を使用するには、パーサーのメモリ アロケータをオーバーライドできるようにする必要があります。または、少なくとも、すべてのメモリを取得する連続したプールをパーサーに与える必要があります (後で一括して割り当てを解除できます)。パーサーの実行可能ファイル自体に約 200kb を割くことができますが、解析で割り当てた動的ヒープは後で解放する必要があります。
- 良い成果。これはそれほど重要ではありませんが、3 GHz プロセッサで 1 秒以内に 100 KB のテキストを解析できるはずです。
- GPL フリーである必要があります。GNU コードは使用できません。
ANTLRworks の IDE とデバッグ ツールは気に入っていますが、その C ターゲットを実際にアプリで動作させるのは大変な作業になりそうです。その話に着手する前に、ANTLR はこの仕事に適したツールですか?
問題のテキスト形式は次のようになります。
antlr - TemplateLanguage/VewEngineの作成
実際の仕事をする以外に、かゆみがあります。私の悩みは、別の言語(Template Toolkit / Perl)のテンプレートシステムを厳密に模倣するビューエンジンを作成することです。これは、新しい種類のプロジェクトを学ぶために時間があったり、やったりした場合の1つです。
私はCoCo/RとANTLRを調べることに時間を費やしました。正直なところ、それは私の脳を傷つけますが、CoCo / Rの一部は沈んでいます。残念ながら、ほとんどの例はソースコードを読み取るコンパイラの作成に関するものですが、テンプレート用のプロセッサを作成する方法をカバーしているようです。
はい、それらは同じことですが、実際のコードが解析されて実行されるのではなく、ソースのほとんどがhtmlであるテンプレートの言語を定義する方法に頭を悩ませることはできません。
この種のことのためにそこに良い初心者のリソースはありますか?私はSparkでガナーを取りましたが、レポに文法が含まれていないようです。
多分それはやり過ぎであり、ファイル内のテンプレート構文をc#にテスト置換してコンパイルすることができます。http://msdn.microsoft.com/en-us/magazine/cc136756.aspx#S2
あなたが私の立場にあり、言語作成の専門家ではなかったとしたら、どこから始めますか?
c# - 文字列を同等のLINQ式ツリーに変換する方法は?
これは、元の問題の単純化されたバージョンです。
Person というクラスがあります。
...そしてインスタンスを言ってみましょう:
愛用のテキストエディタで以下を文字列として書きたいと思います....
この文字列とオブジェクト インスタンスを取得し、TRUE または FALSE を評価します。つまり、オブジェクト インスタンスで Func<Person, bool> を評価します。
ここに私の現在の考えがあります:
- 基本的な比較演算子と論理演算子をサポートするために、ANTLR に基本的な文法を実装します。Visual Basic の優先順位といくつかの機能セットをここにコピーすることを考えています: http://msdn.microsoft.com/en-us/library/fw84t893(VS.80).aspx
- ANTLR に、提供された文字列から適切な AST を作成させます。
- AST をウォークし、Predicate Builderフレームワークを使用して Func<Person, bool> を動的に作成します。
- 必要に応じて Person のインスタンスに対して述語を評価する
私の質問は、これを完全に焼き過ぎたのでしょうか? 代替案はありますか?
編集:選択されたソリューション
私はダイナミック Linq ライブラリ、具体的には LINQSamples で提供されているダイナミック クエリ クラスを使用することにしました。
以下のコード:
結果は System.Boolean 型で、このインスタンスでは TRUE です。
マーク・グラベルに感謝します。
System.Linq.Dynamic nugetパッケージを含めます。ドキュメントはこちら
java - ANTLR 2.7でのC#の例の作成についてサポートが必要
ANTLRv2.7.7に付属するCSHARPV1の例を作成する必要があります。
コマンド:
D:\ Comp \ antlr \ examples \ csharp \ csharp_v1> nant
次の出力が表示されます。
D:\Comp\antlr\examples\csharp\csharp_v1>D:\Comp\nant\bin\nant
NAnt 0.85 (Build 0.85.2478.0; release; 10/14/2006)
Copyright (C) 2001-2006 Gerry Shaw
http://nant.sourceforge.net
Buildfile: file:///D:/Comp/antlr/examples/csharp/csharp_v1/csharp_v1.build
Target framework: Microsoft .NET Framework 2.0
Target(s) specified: test
[tstamp] Monday, May 11, 2009 11:21:20 PM.
[echo] Building project: 'CSharp v1 Grammar Sample for ANTLR' generate:
[exec] java.lang.NoClassDefFoundError: antlr/Tool
[exec] Caused by: java.lang.ClassNotFoundException: antlr.Tool
[exec] at java.net.URLClassLoader$1.run(Unknown Source)
[exec] at java.security.AccessController.doPrivileged(Native Method)
[exec] at java.net.URLClassLoader.findClass(Unknown Source)
[exec] at java.lang.ClassLoader.loadClass(Unknown Source)
[exec] at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
[exec] at java.lang.ClassLoader.loadClass(Unknown Source)
[exec] at java.lang.ClassLoader.loadClassInternal(Unknown Source)
[exec] Could not find the main class: antlr.Tool. Program will exit.
[exec] Exception in thread "main"
BUILD FAILED - 0 non-fatal error(s), 11 warning(s)
D:\Comp\antlr\examples\csharp\csharp_v1\csharp_v1.build(52,10):
External Program Failed: java.exe (return code was 1)
Total time: 0.2 seconds.
私は他のビルドで適切に動作しているnANTを持っています。
私はJavaの男ではありません...どんな助けでも役に立ちます。
敬具、
antlr - Bison REJECTアクションに相当するANTLR?
値に空白以外のものを含めることができるペアのリストを解析しようとしてName=Value
います (つまり、値に等号を含めることができます)。
名前は、通常の識別文字に制限されています。
問題は、「値」トークンがすべてに一致することです。たとえば、入力の場合:
パーサーは入力全体を 'Value' トークンと照合します (そして をスローしますMismatchedTokenException
)。
bisonでは、状態をトークンに割り当てる可能性がありました (または、これは非終端記号のためだけでしたか?) ため、その状態への明示的な移行後にのみマッチングの「適格」になります。
編集考えてみると、これはバイソンでも機能しません-トークンの分割はすでに行われています(flex)。REJECT
ただし、トークンへの方法があったと思います。フレックストライに次善のマッチを強制します。
これが私のANTLR文法です。
parsing - ANTLR:他の数値リテラルも可能な場合に2桁の数値を解析する
私は適度なサイズの言語の文法を書いています、そして私は形式の時間リテラルを実装しようとしていますhh:mm:ss
。
ただし、たとえば、12:34:56
として解析しようとするtimeLiteral
と、数字で不一致のトークン例外が発生します。誰かが私が間違っているかもしれないことを知っていますか?
現在定義されている関連ルールは次のとおりです。
c# - C#でANTLR ASTを歩くためのチュートリアル?
C#でANTLRで生成されたASTを歩くためのチュートリアルを知っている人はいますか?私が見つけた最も近いものはこれですが、それはひどく役に立ちません。
私の目標は、作業中のドメイン固有言語に基づいて生成しているツリーをウォークスルーし、ツリーを使用して生成されたC#コードを出力することです。
Javaベースのチュートリアルも役立ちます-ANTLRASTをトラバースする方法の明確な例を提供するものなら何でも。