提问人:Zzz0522 提问时间:11/8/2023 最后编辑:Zzz0522 更新时间:11/21/2023 访问量:30
与编译器设计中的形式语言理论和解析相关的问题
A question related to formal language theory and parsing in compiler design
问:
我正在尝试扩展 Tiny 语言的语法。“reg”表示正则表达式,“&”表示串联,“#”表示闭包,“?”表示可选元素,“|”表示选择。也支持括号。“BITWISE”用于按位表达式。这是我编译的语法。
assign-stmt->identifier := exp | identifier := reg | identifier += exp
exp->mix-exp or bitwiseor | bitwiseor
bitwiseor->bitwiseor and cmp-exp | cmp-exp
cmp-exp->simple-exp comparison-op simple-exp | simple-exp
comparison-op-> < | = | > | <= | >= | <>
simple-exp->simple-exp addop term | term
addop-> + | -
term->term mulop power | power
mulop-> * | / | %
power->bitwisenot^power | bitwisenot
bitwisenot->not bitwisenot | factor
factor->(exp) | number | identifier
reg->reg "|" regor | regor
regor->regor "&" regand | regand
regand->regcl"#" | regcl"?" | regcl
regcl->(reg) | identifier
当我简化语法时,我发现在 assign-stmt 中,无法区分 exp 和 reg。在递归下降程序中,assign 函数中存在一个问题,即它无法确定是调用 exp 函数还是 reg 函数。这有问题吗?
assign-stmt->identifier (:= exp | := reg | += exp)
exp->bitwiseor {or bitwiseor}
bitwiseor->cmp-exp {and cmp-exp}
cmp-exp->simple-exp [comparison-op simple-exp]
comparison-op-> < | = | > | <= | >= | <>
simple-exp->term {addop term}
addop-> + | -
term->power {mulop power}
mulop-> * | / | %
power->bitwisenot^power | bitwisenot
bitwisenot->not bitwisenot | factor
factor->(exp) | number | identifier
reg->regor {"|" regor}
regor->regand {"&" regand}
regand->regcl["#" | "?"]
regcl->"("reg")" | identifier
我发现: First(exp)={not, (, number, identifier} First(reg)=First(regor)=First(regand)=First(regcl)={(, 标识符}
如何提取左公因数来制作语法 LL(1)?
答: 暂无答案
评论