2013-04-04 49 views
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中做到這一點?

+1

你可以讓'newlines'生產包含一個空終端嗎? – Barmar 2013-04-04 04:22:16

+0

@Barmar - 我可以,但我真的不明白爲什麼我應該這樣做。很可能你永遠不會在普通的文本文件中遇到空字符。另外我們不在這裏處理C字符串。 – 2013-04-04 04:58:48

+0

我不是指空字符,我的意思是空的生產。 – Barmar 2013-04-04 05:00:11

回答

1

我使用Jison,我忽略了空白(包括換行符)。

在我的%法第一行是:

\s+ /* ignore */ 

但你沒有這樣做,如果你不想這樣的。 沿着這些路線試試:

"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",    "$$ = $1"], 
      ["newlines expression",    "$$ = $2"] 
     ], 

這應該允許新行任何金額前/任何表情後。

相關問題