4
我正在Jison中編寫一個簡單的表達式分析器,允許任意數量的換行符遵循表達式中的二元運算符。這是我的語法到目前爲止:你如何在Jison中匹配零個或多個標記?
{
"operators": [
["left", "+", "-"],
["left", "*", "/", "%"]
],
"bnf": {
"program": [
["statement EOF", "return $1;"]
],
"statement": [
["expression newlines", "$$ = $1 + ';';"]
],
"expression": [
["NUMBER", "$$ = yytext;"],
["expression + expression", "$$ = $1 + ' + ' + $3;"],
["expression - expression", "$$ = $1 + ' - ' + $3;"],
["expression * expression", "$$ = $1 + ' * ' + $3;"],
["expression/expression", "$$ = $1 + '/' + $3;"],
["expression % expression", "$$ = $1 + ' % ' + $3;"],
["expression + newlines expression", "$$ = $1 + ' + ' + $4;"],
["expression - newlines expression", "$$ = $1 + ' - ' + $4;"],
["expression * newlines expression", "$$ = $1 + ' * ' + $4;"],
["expression/newlines expression", "$$ = $1 + '/' + $4;"],
["expression % newlines expression", "$$ = $1 + ' % ' + $4;"]
],
"newlines": [
["NEWLINE", ""],
["newlines NEWLINE", ""]
]
}
}
正如你所看到的,我正在爲每個二元運算符寫兩條規則。這在我看來是非常多餘的。我寧願有一個產品匹配零個或多個NEWLINE
令牌(Kleene star),而不是一個或多個令牌(Kleene plus)。你如何在Jison中做到這一點?
你可以讓'newlines'生產包含一個空終端嗎? – Barmar 2013-04-04 04:22:16
@Barmar - 我可以,但我真的不明白爲什麼我應該這樣做。很可能你永遠不會在普通的文本文件中遇到空字符。另外我們不在這裏處理C字符串。 – 2013-04-04 04:58:48
我不是指空字符,我的意思是空的生產。 – Barmar 2013-04-04 05:00:11