0

ply に問題があり、トークン リストと文法 (bnf) を含むファイルを受け取る必要があります。入力を認識する文法を作成しましたが、ほとんど機能しています (小さな問題だけで、解決しています)。例 これは有効な入力ファイルです

#tokens = NUM PLUS TIMES
exp : exp PLUS exp | exp TIMES exp
exp : NUM

(この場合、あいまいな文法などは気にしません。これは入力の例です)

すべての行を個別に解析しても問題ありませんが、次のルールでファイル全体を解析したいと考えています。

  • #tokens は最初の行にのみ含める必要があるため、文法の後に #tokens 宣言がある場合は有効ではありません
  • 「コード」の各行の後に0行以上の空白行を含めることができます
  • 文法規則はいくつでも持つことができます

ループを使用してすべての行を個別にスキャンおよび解析しようとしましたが、最初の (そして非常に重要な) ルールを制御できないため、.py ファイルでこれを試しました:

私は t_NLINEA (改行) を定義しました \n 文字をリテラルとして使用する際にも問題があり、ファイルは \r\n または \n 文字に関する競合を避けるために rU モードを使用して開かれているため、次のルールを追加しました。

def p_S(p):
'''S : T N U'''
print("OK")

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構文エラーが発生します:

なにか提案を?ありがとう

4

1 に答える 1