この文法は再帰的に残されています:
Expression ::= AdditionExpression
AdditionExpression ::=
MultiplicationExpression
| AdditionExpression '+' MultiplicationExpression
| AdditionExpression '-' MultiplicationExpression
MultiplicationExpression ::=
Term
| MultiplicationExpression '*' Term
| MultiplicationExpression '/' Term
Term ::=
Number
| '(' AdditionExpression ')'
Number ::=
[+-]?[0-9]+(\.[0-9]+)?
したがって、理論的には、再帰的降下は機能しません。ただし、各左再帰ルールが特定の優先レベルに対応し、単一のトークンの先読みで正しい生成を選択するのに十分であるという文法のプロパティを利用することで、左再帰ルールをwhileループで個別に解析できます。
たとえば、AdditionExpression非終端を解析するには、次の疑似コードで十分です。
function parse_addition_expression() {
num = parse_multiplication_expression()
while (has_token()) {
get_token()
if (current_token == PLUS)
num += parse_multiplication_expression()
else if (current_token == MINUS)
num -= parse_multiplication_expression()
else {
unget_token()
return num
}
}
return num
}
このタイプのパーサーの正しい名前は何ですか?この有益な記事では、「クラシックソリューション」としてのみ言及しています:https : //www.engr.mun.ca/~theo/Misc/exp_parsing.htm
このタイプのパーサーには適切な名前が必要です。
私にとってそれは一種のパーサーではありません、それは再帰的降下パーサーと組み合わされた左再帰除去の適用です。左再帰を削除する方法については、この質問を参照してください 。
—
AProgrammer 2017
あなたは正しいかもしれません。これは、左再帰の削除アルゴリズムに相当するランタイムに似ています。
—
user71015
「回答」ボックスを使用してコメントやその他のコメントを投稿しないでください。アカウントを作成すると、アクセスを保持し、最も役に立った回答を受け入れることができます。メールアドレスを入力してアクセスできなくなった場合は、アクセスを回復できます。メールアドレスを入力せず、質問の投稿に使用したブラウザやCookieにアクセスできない場合は、おそらく運が悪いでしょう。他の誰もあなたのために答えを受け入れることができません-モデレーターすらです。
—
DW