Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 树梢语法中的罗马数字_Ruby_Treetop - Fatal编程技术网

Ruby 树梢语法中的罗马数字

Ruby 树梢语法中的罗马数字,ruby,treetop,Ruby,Treetop,我想解析一个有序列表,类似于: 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' /

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

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

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

您不小心超载了
文本。将第一行重命名为
,然后为
添加另一条规则

围绕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

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

您意外地重载了
文本。将第一行重命名为
,然后为
添加另一条规则

围绕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

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

我的答案对您有用吗?我的答案对您有用吗?谢谢您的回答。这正是我需要知道的。我还做了你建议的重构,使我的语法更加清晰简洁。谢谢,谢谢你的回答。这正是我需要知道的。我还做了你建议的重构,使我的语法更加清晰简洁。谢谢