一、在程式語言中,請舉例並說明何謂混淆的文法(ambiguous grammar)? (20 分)
詳解 (共 3 筆)
詳解
指的是一個Context Free Grammer中,如果存在一個合法輸入字串,能夠得到多於一個剖析樹(Parsing Tree),則稱作混淆文法
例如:
A -> aA | Aa | ε
input: a
=>
A A
| \ / |
a A or A a
| |
ε ε
詳解
混淆的文法(Ambiguous Grammar)
混淆的文法指的是一種文法,它可以為同一個輸入字符串生成多於一個的解析樹(或推導樹)。這意味著存在多種不同的方式來解析這個字符串,使得其語法結構不唯一。混淆的文法在編譯器設計中會導致語義模糊,因為同一個輸入可能會被解釋為多種不同的結構。
混淆的文法指的是一種文法,它可以為同一個輸入字符串生成多於一個的解析樹(或推導樹)。這意味著存在多種不同的方式來解析這個字符串,使得其語法結構不唯一。混淆的文法在編譯器設計中會導致語義模糊,因為同一個輸入可能會被解釋為多種不同的結構。
例子:Python 中的混淆文法
考慮一個簡單的文法,用來解析算術運算中的加法和乘法。這裡有一個可能的混淆文法示例:
考慮一個簡單的文法,用來解析算術運算中的加法和乘法。這裡有一個可能的混淆文法示例:
python
複製程式碼
import lark
複製程式碼
import lark
grammar = """
?start: expr
?expr: expr "+" term -> add
| term
?term: term "*" factor -> mul
| factor
?factor: NUMBER -> number
| "(" expr ")"
?start: expr
?expr: expr "+" term -> add
| term
?term: term "*" factor -> mul
| factor
?factor: NUMBER -> number
| "(" expr ")"
%import common.NUMBER
%import common.WS
%ignore WS
"""
%import common.WS
%ignore WS
"""
parser = lark.Lark(grammar)
# 解析字符串
parse_tree = parser.parse("3 + 4 * 5")
print(parse_tree.pretty())
parse_tree = parser.parse("3 + 4 * 5")
print(parse_tree.pretty())
詳解
混淆文法(ambiguous grammar)指的是若一語言的某一語句,依其 BNF 文法規則來推導,可繪出兩棵以上的不
同剖析樹。