ANTLR 文法を継承し、Python Lex Yacc を変更せずに実装しました。私の問題は、ANTLR は通常非常に高レベルの EBNF を使用して文法を定義するのに対し、Yacc は単純な文脈自由文法を使用することです。
二項式の AST 定義に苦労しています。ANTLRから与えられると、それらは次のようになります
disjunction
: conjunction ('||' conjunction)*
この定義は優先順位のために存在します。名前については気にしないでください。
私のCFGでは、次のようになります
def p_sum(self, p):
""" sum : product product_list """
???
def p_product_list(self, p):
""" product_list : PLUS product product_list
| MINUS product product_list
| epsilon
"""
???
他のいくつかの表現は次のようになります
def p_disjunction_1(self, p):
""" disjunction : conjunction """
p[0] = p[1]
def p_disjunction_2(self, p):
""" disjunction : conjunction OR disjunction """
p[0] = BinaryOp(p[2], p[1], p[3], p[1].coord)
私が望むのは、2 番目の例に示すように、AST が BinaryExpression ノードのみで構成されることです。
BinaryExpression('+', lhs, rhs)
しかし、この文法は要因のリストを与えてくれます。私のやり方で書く方法はありますか???? 必要な場所はASTを構築するための式ですが、それを行う良い方法が思いつきません。私が見ているのは、単項式のリストでノードを定義することですが、それは私にとって醜いです。または、文法を書く別の方法はありますか?別のものを解析する方法で変更するのではないかと恐れているため、あえて触れません。