問題タブ [ply]
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.
python - パーサー python ply を使用して、文字列と数値を混合入力として使用する電卓を作成する方法
Python で英語の単語と数字を認識する計算機を実行するための演習の助けを求めたいのですが、現在は PLY (Python Lex-Yacc) を使用しています。
数字と演算子は、「plus」=「+」、「two」=2、「112」=112 など、英単語を使用して文字列として記述された 2 つの形式で指定できます。
例としては、次のエントリがあります。
「25 割る 5」または「25 / 5」または「25 割る 5」
結果は同じで、数字の 5 (文字列ではありません) になります。
" -3 かける 4" は -12 になります
0 で割ると「エラー」になります。「34 を 0 で割ると」エラーになります。
これは、いくつかの基本的な演算子「-」、「+」、「x」、および「/」(マイナス、プラス、時間、および除算)に対して、数学記号を入力するか、テキストを入力するか、混合した場合に機能するはずです。
ここに私のコードのいくつかの部分があります:
#代入定義をここで変更しました。
トークンの定義が間違っていませんか? 数字が英語の文字または数字で紹介できることをどのように判断できますか?
式(p[2] == '+' : p[0] = p[1] + p[3])
は 1 文字である必要があります。このフォームに書くことが有効でないのはなぜp[2] == 'plus' : p[0] = p[1] + p[3]
ですか?
sfk によって提案されたコードを追加しましたが、英単語でテキストとして入力された数字と演算子を認識するのにまだ問題があります。
私が間違っていることについて何か考えがありますか?
python - Python の PLY ライブラリでレキシング ルールを変更する
コンパイラのクラスで、講師は、これから実装する言語の文法ではパーサーで先読みが必要になると教えてくれました。flex のようなツールを使用すると、 で簡単に実行できますfoo/x
。
私は現在、Python がプロジェクトに適しているかどうかを確認するために、PLY ライブラリを使用して Python でサンプル プログラムを実行しようとしています。FORTRAN の do ループの単純なバージョンを実装しようとしています。
現在、私の考えは、DO
キーワードに一致し、残りの入力がループに一致するかどうかを確認することです。存在する場合は、DO
トークンを返します。それ以外の場合は、入力を「巻き戻して」識別子ルールに進みたいと思います。何かのようなもの:
parsing - YACC: 特定のパスの解析を停止します
特定の言語を解析するために Python PLY を使用しています。次のような文法の場合:
値がわかっているcondition
場合、True と言うと、パスstmtlist
内の解析を停止する方法はありますか?ELSE
ありがとう、
python - 二項式の AST の作成
ANTLR 文法を継承し、Python Lex Yacc を変更せずに実装しました。私の問題は、ANTLR は通常非常に高レベルの EBNF を使用して文法を定義するのに対し、Yacc は単純な文脈自由文法を使用することです。
二項式の AST 定義に苦労しています。ANTLRから与えられると、それらは次のようになります
この定義は優先順位のために存在します。名前については気にしないでください。
私のCFGでは、次のようになります
他のいくつかの表現は次のようになります
私が望むのは、2 番目の例に示すように、AST が BinaryExpression ノードのみで構成されることです。
BinaryExpression('+', lhs, rhs)
しかし、この文法は要因のリストを与えてくれます。私のやり方で書く方法はありますか???? 必要な場所はASTを構築するための式ですが、それを行う良い方法が思いつきません。私が見ているのは、単項式のリストでノードを定義することですが、それは私にとって醜いです。または、文法を書く別の方法はありますか?別のものを解析する方法で変更するのではないかと恐れているため、あえて触れません。
string - ply (python) で特定の形式のファイルを解析する
ply に問題があり、トークン リストと文法 (bnf) を含むファイルを受け取る必要があります。入力を認識する文法を作成しましたが、ほとんど機能しています (小さな問題だけで、解決しています)。例 これは有効な入力ファイルです
(この場合、あいまいな文法などは気にしません。これは入力の例です)
すべての行を個別に解析しても問題ありませんが、次のルールでファイル全体を解析したいと考えています。
- #tokens は最初の行にのみ含める必要があるため、文法の後に #tokens 宣言がある場合は有効ではありません
- 「コード」の各行の後に0行以上の空白行を含めることができます
- 文法規則はいくつでも持つことができます
ループを使用してすべての行を個別にスキャンおよび解析しようとしましたが、最初の (そして非常に重要な) ルールを制御できないため、.py ファイルでこれを試しました:
私は t_NLINEA (改行) を定義しました \n 文字をリテラルとして使用する際にも問題があり、ファイルは \r\n または \n 文字に関する競合を避けるために rU モードを使用して開かれているため、次のルールを追加しました。
def p_N(p): '''N : NLINEA N''' パス
def p_N2(p): '''N: ''' パス
def p_U(p): '''U : RN U''' パス
def p_U2(p): '''U : ''' パス
(上で言ったように、ply は文法で \n リテラルを受け入れなかったので、N 規則を使用しなければなりませんでした。\n を "literals" 変数に追加しました)
T は #tokens 宣言を解析するルールであり、R は文法ルールを解析するために使用されます。T と R は、1 行の文字列で使用すると問題なく動作しますが、上で書いたプロダクションを追加すると、解析時に構文エラーが発生します。最初の文法規則、たとえば、A : B C
構文エラーが発生します:
なにか提案を?ありがとう
python - 数値の PLY lexer は常に double を返します
次のプログラムを使用して、int と double を使用した ply lex で問題が発生しています。DOUBLE_VAL は 1 に対して返されますが、INT_VAL が必要でした。INT_VAL 関数と DOUBLE_VAL 関数の順序を変更すると、小数点でエラーが発生します。どうすれば解決できますか?
python - マルチライン生産を指定する PLY yacc
次の構文で複数行の生産を定義する方法はありますか? PLY は : 行ごとに 1 つの生産を意味する ID の前に期待します。