我目前正在学习句法分析.我正在尝试创建一个可以生成特定语法的元语法:
A ? A '+' C | C ;
C ? C * Q ;
C ? Q ;
Q ? a | b | 'A' | "B" | "(" A ")" | <num> ;
<num> ? <Signed Int> | Float ;
<Signed Int> ? Signe Int ;
Signe ? '-' | '+' | ~eps~
<Int> ? Digit Int | Digit ;
Digit ? '1' | '2' | '3' | '4' | 5 | 6 | 7 | 8 | "9" | "0" ;
Float ? Int '.' Int ;
Run Code Online (Sandbox Code Playgroud)
在哪里<>被忽略(即<int>相同int),单引号或双引号用于字符串,~eps~用于epsilon.其他一切都被视为一种符号(无论是终端还是非终结).
目前我有这样的事情:
S ? left "?" right ";" | ?
left ? symb | "<"symb">"
right ? QP
Q ? symb | """symb""" | "'"symb"'" | "<"symb">" | ?
P ? symb | '|' Q | ?
Run Code Online (Sandbox Code Playgroud)
但是对我来说这感觉很不对劲,我不确定该怎么做.有没有确定元语法的方法?我怎么能这个呢?
不错的开始。你真的应该定义 symb:
\n\nletter = "A" | "B" | ... | "Z" ;\nsymb = letter symb | letter ;\nRun Code Online (Sandbox Code Playgroud)\n\n但你的元语法只允许一个语法规则。\n要允许多个规则,我想你想写:
\n\n S = R S | \xce\xb5 ;\n R = left "\xe2\x87\x92" right ";"\nRun Code Online (Sandbox Code Playgroud)\n\n您可能对使用元语法来处理自身语法和其他语法的工具非常感兴趣。这篇关于MetaII的小论文(准备好了吗?)1964 年讨论了这个问题并展示了如何使用它构建编译器。这是一篇令人惊叹的论文,它会扭曲你的大脑(以一种好的方式!)
\n\n当您读完本文后,您会对元语法感到非常满意。(我在 20 世纪 70 年代初就学会了使用它来构建编译器)。
\n