別の言語認識ツール4

1.プロローグ



数年前、彼はレポートを計算するための内部言語を開発しました。これは当社で使用されています。 この言語は奇妙であることが判明しました。ループも標準の条件文(if)も動的型付けもありませんが、その機能に対処しました。 この言語のアイデアは、単純な式評価器を実装することでした。 時間が経つにつれて、要件が増え、その結果、言語が拡張し始めたため、新しい関数を追加するための簡単なスクリプトを開発する必要がありました。



これまで、レポートを計算するための内部言語は、アジャイルミュータントではなくモンスターに変わりました。 この作成により、ドキュメンテーションの欠如、拡張の容易さ、開発者の怠inessが生まれました(内容を把握して適切なものを見つけるよりも、新しいものを書く方が簡単です)。 この言語は、意図していないことの多くを行うことができるようになりました(パンケーキが彼に焼く方法を教えなかったが、それは残念です)。



2.再考



学科は拡大し始め、この言語を教える必要のある新参者が現れましたが、これは簡単なことではありません。 現在のシステムの欠点を排除して、レポートを新しいシステムに転送することが決定されました。タスクは、登場した分析部門によって複雑になっています。 相互作用は、分析->計算->開発->スクリプト->分析のようなものです。 内部言語のコードはアナリスト(プログラマーではない)によって読み取られ、エラーが検出された場合は改訂のために送信される必要があるため、タスクは複雑です。 素晴らしいですね-それをしてください! 前の罪の、いのために、それは評決でした、仕事は私のところに行きました。 タスクが表明され、批評家の声がどこかに置かれたとき、「サイクルはどこですか?」 開発者はどうやらそれらについて知らなかったようです」、「すべてをc#で書く方が簡単ではないですか?」 C = a + b」。 鋭い言語構成は、分析部門で非常に適切です(機能的な三項演算子のような言葉は、マットのように聞こえます)。



3.解決策を見つける



この言語の現在のバージョンは、当時の知識も経験もないために開発されたもので、現在のニーズを満たすものを迅速に開発する必要がありました。 現時点では、「いや、このナンセンスをするために座って!」という経験があります。 知識なし! 他人の経験と知識を活用する必要があります。」 最初に頭に浮かぶのは、コンパイラーの開発です(かなりアイデアがあります)。 それを見つけた 。 見た後、私はそれが非常に興味深く、非常に困難であることに気づき、コンパイラを過度にハイキングしました。 プロジェクトでは時々、さまざまなサービスの構成ファイル(通常はxml)を使用し、誇らしげにDSLと呼んでいます! 略語をより詳細に理解することにしました。キャンペーンが必要です。 私はすでにこの叔父に精通している。彼はデザインの分野で弱者ではない。彼の作品に親しむ必要がある。 この本では、彼は常にANTLRに言及しています。



4. VSにANTLR4をインストールする



VSでのANTLRの使用に関する適切な記事を見つけられなかったため、この記事を書くようになりました(実際、すべてがシンプルで、知っているとき、知っているとき、すべてがシンプルです)。 ここでは 、原則として、例を説明します(プロジェクトファイルを手動で編集)。 転がりません。 必要なものはすべて、スタジオ自体の拡張機能とナゲットにあります。

ANTLR言語サポート:



画像



それは何を与えます:



画像



以下は、nugetを使用した2つのライブラリです。



画像



Grammarが作成され、Calculator.g4ファイルがantlr4 Combined Grammarプロジェクトに追加されました。 このようなもので:



grammar Calculator; @parser::members { protected const int EOF = Eof; } @lexer::members { protected const int EOF = Eof; protected const int HIDDEN = Hidden; } /* * Parser Rules */ prog: expr+ ; expr : left = expr op=('*'|'/') right = expr # MulDiv | left = expr op=('+'|'-') right = expr # AddSub | INT # int | '(' expr ')' # parens ; /* * Lexer Rules */ INT : [0-9]+; MUL : '*'; DIV : '/'; ADD : '+'; SUB : '-'; EQU : '='; WS : (' ' | '\r' | '\n') -> channel(HIDDEN) ;
      
      





上記のサイトからほとんど変更されていません。 ファイルプロパティで設定する必要があります:



画像



さらにF5 ...そして何も、エラーも、約束のCalculatorBaseVisitor.csもありません。 ああ、はい、どうすれば忘れられますか、JAVAプログラムを実行する環境がありません(C#での開発にはJAVAが必要なのは壮観です)。



プロジェクトを開始するための2回目の試行では、以下が生成されます。



エラー5 '@'は私にとって完全な驚きでした

エラー2 '╗'は完全に驚きました

「3grammar」でエラー3が見つからないSEMI



など。 私たちの心やGoogleに絶望はありません。一般的に、問題はエンコーディングにあります。utf8(BOM)はutf8(BOMなし)でなければなりません。



ファイルを開くときにMS Wordがショックを受ける:



画像



私はそれをWindowsに変換しました-1251と、ファイルの先頭の曲がった文字がすぐに表示されます(面白いが、他のマシンではそのような問題はありませんでした)。



プロジェクトはアセンブルされましたが、(最近は常に何かありました)、プロジェクトで約束されたCalculatorBaseVisitor.csが見つかりませんでした。 Yandexはすべてのカードを開きました(どの検索エンジンでもかまいません)... \ obj \ Debug-生成されたアナライザーファイルはここに存在します。正しく生成されたファイルであり、変更できません。wpfは.gファイルを同じフォルダーにドロップしますが、訪問者はそれらをダンプしますParserとLexerがプロジェクトに追加されたとき、私は不便でしたが、訪問者はそうではありませんでした。



さらに、文法の例を取り上げたリンクからレッスンを完了することができます。



次へ



PS



おそらくすべての問題は、ANTLRのネイティブ言語がJAVAであり、C#でジェネレーターがそれほど普及していないという事実によるものですが、すべての接続の問題(1時間ではない)を克服した後、C#の例は非常に良好であることが判明しました十分ではありません。



PPS



実際のイベントに基づいています。 一部の名前とイベントは、著作権とセキュリティ上の理由で虚偽表示されています。



All Articles