【问题标题】:Roman numerals in treetop grammar树梢语法中的罗马数字
【发布时间】:2013-07-10 00:27:40
【问题描述】:

我想解析一个有序列表,类似于:

I - Something
II - Something else...
IX - Something weird
XIII - etc

到目前为止,我的树顶语法是:

rule text
    roman_numeral separator text newline
end

rule roman_numeral
    &. ('MMM' / 'MM' / 'M')? (('C' [DM]) / 
    ('D'? ('CCC' / 'CC' / 'C')?))? (('X' [LC]) / 
    ('L'? ('XXX' / 'XX' / 'X')?))? (('I' [VX]) / 
    ('V'? ('III' / 'II' / 'I')?))?
end

rule separator
    [\s] "-" [\s]
end

rule text
    (!"\n" .)*
end

rule newline
    ["\n"]
end

但是,相应的解析器无法解析文本。什么坏了?

【问题讨论】:

  • 我的回答对你有用吗?

标签: ruby treetop


【解决方案1】:

你不小心超载了text。将第一个重命名为line,然后为lines 添加另一个规则。

换行符周围的引号似乎也没有必要。

提示 - 您可以在 text 规则中重复使用 newline 规则以使其保持干燥。

grammar Roman

  rule lines
    line*
  end

  rule line
    roman_numeral separator text newline
  end

  rule roman_numeral
    &. ('MMM' / 'MM' / 'M')? (('C' [DM]) /
    ('D'? ('CCC' / 'CC' / 'C')?))? (('X' [LC]) /
    ('L'? ('XXX' / 'XX' / 'X')?))? (('I' [VX]) /
    ('V'? ('III' / 'II' / 'I')?))?
  end

  rule separator
    [\s] "-" [\s]
  end

  rule text
    (!newline .)*
  end

  rule newline
    [\n]
  end

end

更新

您可以通过删除否定前瞻和单字符类来稍微简化语法。

rule separator
  " - "
end

rule text
  [^\n]*
end

生成的语法图变得更加简单。

【讨论】:

  • 感谢您的回答。这正是我需要知道的。我还进行了您建议的重构,使我的语法更加清晰简洁。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-28
  • 1970-01-01
  • 1970-01-01
  • 2023-01-17
  • 2015-05-16
相关资源
最近更新 更多