問題タブ [lexer]
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.
compiler-construction - ANTLRレクサーがトークンと一致しない
私は単純なANTLR文法を持っています。これは、私が抱えているこの問題を実証するために、必要不可欠なものまで取り除いています。ANTLRworks1.3.1を使用しています。
明らかに、このステートメントは文法によって受け入れられます:
しかし、これも次のとおりです。
ANTLRworksインタプリタからの出力:
(出典:cs.sierracollege.eduのbarry)
私は何が間違っているのですか?ANTLRに付属している他のサンプル文法(CMinus文法など)でも、この動作を示します。
php - PHP での CSS のトークン化のパフォーマンス
これは、これまでパーサー/レクサーを作成したことがない人からの初歩的な質問です。
PHP で CSS のトークナイザー/パーサーを作成しています (「OMG、なぜ PHP で?」と繰り返さないでください)。構文は W3C によってここ (CSS2.1)とここ (CSS3、ドラフト)にきちんと書き留められています。
これは 21 の可能なトークンのリストであり、すべて (2 つを除く) を静的文字列として表すことはできません。
私の現在のアプローチは、21 個のパターンを含む配列を何度もループしてif (preg_match())
、ソース文字列の一致を一致ごとに減らしていくというものです。原則として、これは非常にうまく機能します。ただし、1000 行の CSS 文字列の場合、これには 2 ~ 8 秒かかります。これは、私のプロジェクトには多すぎます。
今、私は他のパーサーがどのように CSS をトークン化して数秒で解析するのか頭を悩ませています。OK、Cは常に PHP よりも高速ですが、それにもかかわらず、明らかなD'Oh!はありますか? 私が陥ったのですか?
残りの文字列の最初の文字として「@」、「#」、または「"」をチェックし、関連する正規表現のみを適用するなど、いくつかの最適化を行いましたが、これによりパフォーマンスが大幅に向上することはありませんでした。
これまでの私のコード(スニペット):
gcc - lex の出力をコンパイルできません
この単純な lex プログラムの出力をコンパイルしようとすると、次のようになります。
使用:
私は得る:
lex --version は、実際には 'flex 2.5.35' を使用していることを示していますが、ls -fla `which lex` はシンボリック リンクではありません。出力がコンパイルされない理由はありますか?
c# - パーサーをハンドコーディングする
コンパイラの専門家の皆さん、私は再帰降下パーサーを書きたいと思っています。それをコードだけでやりたいのです。他の文法からレクサーとパーサーを生成せず、ドラゴンブックを読むように言わないでください。最終的にはそれに近づきます。
CSS などの合理的な単純な言語のレクサーとパーサーの実装について、ザラザラした詳細に入りたいと思います。そして、私はこれを正しく行いたいです。
これはおそらく一連の質問になるでしょうが、今はレクサーから始めています。CSS のトークン化ルールについては、こちらを参照してください。
私は次のような自己記述コードを見つけました (うまくいけば、このスニペットから残りを推測できます):
これは何と呼ばれていますか?そして、私は合理的によく理解されているものからどのくらい離れていますか? スタックを使用してある種のステートマシンを実装することは非常にうまく機能していますが、このように続ける方法がわかりません。
私が持っているのは、一度に 1 文字を読み取ることができる入力ストリームです。私は今のところ頭を見ていません。ただキャラクターを読んで、現在の状態に応じてそれで何かをしようとします.
再利用可能なコードのスニペットを作成するというマインド セットに取り組みたいと思っています。このTransition
メソッドは現在、それを行うための手段であり、スタックの現在の状態をポップしてから、逆の順序で引数をプッシュします。そうすれば、私が書くTransition(ParserState.SubIdent, ParserState.Init)
と、サブルーチンが「呼び出され」、SubIdent
完了すると状態に戻りInit
ます。
パーサーはほぼ同じ方法で実装されます。現在、このようにすべてを単一の大きなメソッドに含めると、トークンを見つけたときにトークンを簡単に返すことができますが、すべてを単一の大きなメソッドに保持する必要があります。これらのトークン化ルールを別々の方法に分割する良い方法はありますか?
lexer - レクサー/パーサーのあいまいさ
レクサーはこのあいまいさをどのように解決しますか?
それは、複数行のコメントの始まりであり、その後に別の複数行のコメントが続くというだけではないのはどうしてですか。
貪欲なレクサーは、次のトークンを返すだけではないでしょうか。
- / *
- / *
- /
私はCSS用のshift-reduceパーサーを書いている最中ですが、この単純なコメントが邪魔になっています。これ以上の背景情報が必要ない場合は、この質問を読むことができます。
アップデート
そもそもこれを省略してすみません。このフォームでCSS言語に拡張機能を追加することを計画していますが、 /* @ func ( args, ... ) */
CSSを理解しているが、私のこの拡張機能コメントを理解していないエディターを混乱させたくありません。そのため、レクサーはコメントを無視できません。
scala - scala StdLexicalで改行をレクシングしますか?
C のような言語を lex (その後、解析) しようとしています。C では、改行が重要なプリプロセッサ ディレクティブがあり、実際のコードでは改行が単なる空白です。
これを行う 1 つの方法は、初期の C コンパイラのような 2 パス プロセスを実行することです。# ディレクティブ用に別のプリプロセッサを用意し、その出力を lex します。
しかし、単一のレクサーでそれが可能かどうか疑問に思いました。StdLexical
scala パーサーとコンビネーターのコードを書くことにはかなり満足していますが、 が空白をどのように処理するかについてはよくわかりません。
#include
改行を使用して行をレックスし、改行を無視していくつかの簡単なコードを書くことができると言う単純なサンプルコードを誰かが書くことができますか? それとも、これは不可能であり、2 パスアプローチを使用する方がよいでしょうか?
c# - 式を評価するための C# コードの解析 (基本的に、Intellisense の実装)
型付けされた C# コードを評価しようとしています。IDE を作成しようとしているかのように考えてください。
したがって、人がコードを入力した場合、私は彼が今書いたコードを知りたい:
x が String 型であることを登録したいと思います。そして今、ユーザーが x をもう一度入力するたびに、基本的に Visual Studio Intellisense のように、x でできるすべてのことを示したいと思います。
これにはいくつかのレクサーまたはパーサーが必要ですか? それはそれをより簡単にしますか?VS 2010 には、これに関して Microsoft がリリースしたいくつかの機能があると聞いています。何か案は?
grammar - フレックス、マルチラインルール
こんにちは、レクサー定義内にフレックスルールがあります:
このルールをより明確に保つために、より多くの行に分割する方法はありますか?マクロと同じように\を試してみましたが、flexでは受け入れられないようです:(
PS:ルールをより多くのサブルールに分割したくはありませんが、コードを明確に保つために、正規表現をより多くの行に分割するだけです。
javascript - ()でラップせずにネイティブJavascriptタイプのメソッドを呼び出す
Javascriptでは、丸括弧で囲まずに文字列リテラルのメソッドを直接呼び出すことができます。ただし、数値や関数などの他のタイプは対象外です。これは構文エラーですが、Javascriptレクサーがこれらの他のタイプを丸括弧で囲む必要がある理由はありますか?
たとえば、アラートメソッドを使用してNumber、String、およびFunctionを拡張し、リテラルでこのメソッドを呼び出そうとすると、Stringに対しては機能しますが、NumberおよびFunctionのSyntaxErrorになります。
文字列オブジェクトに対して直接alertを呼び出すことができます。
しかし、それは数値と関数の構文エラーです。
これらのタイプを使用するには、角かっこで囲む必要があります。
更新:
@Crescentによるリンクと@Davおよび@Timothyによる回答7.alert()
は、数値定数を探しているために失敗する理由を説明しています。それを乗り越えるには、余分な空白または余分なドットを挿入します。
関数を呼び出す前に関数を括弧で囲む必要があるのと同様の構文上の理由はありますか?
Rubyは動的言語であり、この問題を処理するため、ある種の先読みで解決できる問題であるかどうかを知るために、通訳者や字句解析者に精通していません。例えば:-
アップデート2:
@CMSの答えは、関数が上記で機能しなかった理由を理解する上で的を射ています。以下のステートメントは機能します。
parsing - レクサーとパーサー
レクサーとパーサーは理論的にそんなに違うのですか?
正規表現を嫌うのは流行のようです:コーディング ホラー、別のブログ投稿。
ただし、一般的な字句ベースのツールであるpygments、geshi、またはprettifyは、すべて正規表現を使用します。彼らは何でもレックスするようです...
lexing で十分な場合、EBNF が必要になるのはいつですか?
これらのレクサーによって生成されたトークンを bison または antlr パーサー ジェネレーターで使用した人はいますか?