Tata bahasa ini dibiarkan rekursif:
Expression ::= AdditionExpression
AdditionExpression ::=
MultiplicationExpression
| AdditionExpression '+' MultiplicationExpression
| AdditionExpression '-' MultiplicationExpression
MultiplicationExpression ::=
Term
| MultiplicationExpression '*' Term
| MultiplicationExpression '/' Term
Term ::=
Number
| '(' AdditionExpression ')'
Number ::=
[+-]?[0-9]+(\.[0-9]+)?
Jadi secara teori, keturunan rekursif tidak akan berhasil. Tetapi dengan mengeksploitasi sifat-sifat tata bahasa yang sesuai dengan masing-masing aturan rekursif-kiri sesuai dengan tingkat presedensi tertentu, dan bahwa melihat-lihat token tunggal sudah cukup untuk memilih produksi yang benar, aturan rekursif kiri dapat secara individual diuraikan dengan sementara loop.
Misalnya, untuk mem-parsing AdditionExpression non-terminal, pseudocode ini mencukupi:
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
}
Apa nama yang tepat untuk tipe parser ini? Artikel informatif ini hanya menyebutnya sebagai "Solusi Klasik": https://www.engr.mun.ca/~theo/Misc/exp_parsing.htm
Harus ada nama yang tepat untuk jenis parser ini.
reference-request
formal-grammars
recursion
parsers
left-recursion
pengguna71015
sumber
sumber
Jawaban:
Ini hanya pengurai LL (1) yang diimplementasikan dengan turunan rekursif.
Dimulai dengan:
menerapkan penghapusan rekursi kiri untuk mendapatkan tata bahasa LL (1):
tulis fungsi yang sesuai:
hapus rekursi ekor:
Di barisan:
dan Anda baru saja menambahkan pemrosesan semantik untuk mendapatkan fungsi Anda.
sumber
Anda ingin melihat penguraian LL ( )k . Artikel Wikipedia sebagian besar tidak berguna, tetapi pada dasarnya adalah turunan rekursif dengan simbol lookahead.k
Ada juga LL ( ) yang memungkinkan lookahead tanpa batas.∗
Lihat di sini untuk ikhtisar yang komprehensif tentang seberapa kuat kelas parser ini.
sumber