您将如何在以下任何可以处理Python/Haskell/CoffeScript样式缩进的分析器生成器(PEG.js,Citrus,Treetop)中编写解析表达式语法:
尚未存在的编程语言的示例:
square x =
x * x
Run Code Online (Sandbox Code Playgroud)
cube x =
x * square x
Run Code Online (Sandbox Code Playgroud)
fib n =
if n <= 1
0
else
fib(n - 2) + fib(n - 1) # some cheating allowed here with brackets
Run Code Online (Sandbox Code Playgroud)
更新: 不要尝试为上面的示例编写解释器.我只对缩进问题感兴趣.另一个例子可能是解析以下内容:
foo
bar = 1
baz = 2
tap
zap = 3
# should yield (ruby style hashmap):
# {:foo => { :bar => 1, :baz => 2}, :tap => { :zap => …Run Code Online (Sandbox Code Playgroud) 我正在尝试自学Ruby的Treetop语法生成器.我发现,不仅文档中的"最佳"文档非常稀疏,而且它似乎并不像我希望的那样直观.
在高层次上,我真的很喜欢比现场文档或视频更好的教程,如果有的话.
在较低的层次上,这是一个我根本无法工作的语法:
grammar SimpleTest
rule num
(float / integer)
end
rule float
(
(( '+' / '-')? plain_digits '.' plain_digits) /
(( '+' / '-')? plain_digits ('E' / 'e') plain_digits ) /
(( '+' / '-')? plain_digits '.') /
(( '+' / '-')? '.' plain_digits)
) {
def eval
text_value.to_f
end
}
end
rule integer
(( '+' / '-' )? plain_digits) {
def eval
text_value.to_i
end
}
end
rule plain_digits
[0-9] [0-9]*
end
end
Run Code Online (Sandbox Code Playgroud)
当我加载它并在一个非常简单的测试对象中运行一些断言时,我发现:
assert_equal @parser.parse('3.14').eval,3.14
Run Code Online (Sandbox Code Playgroud)
工作正常,而
assert_equal …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Treetop来解析ERB文件.我需要能够处理如下行:
<% ruby_code_here %>
<%= other_ruby_code %>
Run Code Online (Sandbox Code Playgroud)
由于Treetop是用Ruby编写的,而你用Ruby编写Treetop语法,Treetop中已经有一些现有方法可以说"嘿,在这里寻找Ruby代码,并给我分解",而不必编写单独的规则来处理Ruby语言的所有部分?我正在寻找一种方法,在我的.treetop语法文件中,有类似的东西:
rule erb_tag
"<%" ruby_code "%>" {
def content
...
end
}
end
Run Code Online (Sandbox Code Playgroud)
凡ruby_code由树顶提供了一些规则进行处理.
编辑: 其他人使用Ruby-lex解析ERB,但我在尝试重现他所做的事时遇到了错误.在生成解析器类时,rlex程序没有生成完整的类.
编辑:对,所以你很多都很郁闷,但感谢你的信息.:)对于我的Master的项目,我正在编写一个测试用例生成器,需要使用ERB作为输入.幸运的是,出于我的目的,我只需要识别ERB代码中的一些内容,例如if语句和其他条件以及循环.我想我可以提出Treetop语法来匹配它,但需要注意的是Ruby并不完整.
在工作中,我的团队使用 Ruby 和 Treetop 解析器创建了我们自己的小型脚本语言。该语言本身的语法与 Ruby 非常相似。
我正在使用 Ruby 和 Ruby 扩展来为我们的这种语言的文件进行语法高亮显示,但是 Ruby 扩展会引发错误,因为该语言实际上不是 Ruby。
有没有办法禁用特定文件类型的错误检查?我应该分叉 Ruby 扩展吗?
谢谢。
有没有人见过treetop的vim缩进文件,Ruby解析器/生成器?我发现了一个vim语法高亮显示文件,但没有看到缩进文件.
我有一个语法文件,用于我正在尝试构建的新通用编程语言.我正在尝试使语言健壮且自然地使用(它受到Ruby等人的很大启发),并且在这样做时我引入了一些左递归规则.
我看过一些似乎表明以下左递归规则的例子:
rule l_recurse
l_recurse / 'something else'
end
Run Code Online (Sandbox Code Playgroud)
可以通过将其更改为以下来进行非左递归:
rule r_recurse
'something else' / r_recurse
end
Run Code Online (Sandbox Code Playgroud)
对我来说,这似乎会有一个不同的问题,但仍然会失败.我是对的,还是这个"只是工作"?
我正在尝试(查找和)消除的特定左递归在此语法文件中找到.我不确定哪些规则受到影响,但至少有一些规则被指出有左递归.(顺便说一下,我试图通过收紧范围规则来消除他提到的具体范围问题.)
我是Treetop的新手并尝试编写CSS/HSS解析器.HSS通过嵌套样式,变量和一种mixin功能增强了CSS的基本功能.
我非常接近 - 解析器可以处理CSS - 但是在实现样式中的样式时我会堕落.例如:
#rule #one {
#two {
color: red;
}
color: blue;
}
Run Code Online (Sandbox Code Playgroud)
我对它进行了两次射击,一次是处理空白,一次是处理空白.我不能上班.树梢文件有点稀疏,我真的觉得我缺少一些基本的东西.希望有人可以帮我.
A:
grammar Stylesheet
rule stylesheet
space* style*
end
rule style
selectors space* '{' space* properties? space* '}' space*
end
rule properties
property space* (';' space* property)* ';'?
end
rule property
property_name space* [:] space* property_value
end
rule property_name
[^:;}]+
end
rule property_value
[^:;}]+
end
rule space
[\t ]
end
rule selectors
selector space* ([,] space* selector)*
end
rule selector
element …Run Code Online (Sandbox Code Playgroud) 我对于一种新的编程语言有了一些想法,所以我想我会尝试实现它.一位朋友建议我尝试使用Treetop(Ruby gem)来创建一个解析器.Treetop的文档稀少,我以前从未做过这样的事情.
我的解析器就像它有一个无限循环,但没有堆栈跟踪; 事实证明难以追查.有人能指出我的入门级解析/ AST指南的方向吗?我真的需要一些列出规则,常用用法等东西来使用像Treetop这样的工具.我的解析器语法在GitHub上,以防有人希望帮助我改进它.
class {
initialize = lambda (name) {
receiver.name = name
}
greet = lambda {
IO.puts("Hello, #{receiver.name}!")
}
}.new(:World).greet()
Run Code Online (Sandbox Code Playgroud) 我有一个只有两条规则的树梢语法:
grammar RCFAE
rule num
[0-9]+ <Num>
end
rule identifier
[a-zA-Z] [a-zA-Z]* <ID>
end
end
Run Code Online (Sandbox Code Playgroud)
我正在尝试解析简单的字符串("A"和"5").如果我把该规则放在第一位,则"5"被识别为Num,如果我将该规则放在第二位,则返回nil.类似地,如果我将该规则放在第一位,则"A"被识别为ID,如果我将该规则放在第二位,则返回nil.我无法理解这两个规则如何以任何方式重叠.这让我疯狂!
关于树梢或正则表达式,我是否缺少或不理解?在此先感谢您的帮助.
我如何在Treetop中做这样的事情?
/.+?;/
Run Code Online (Sandbox Code Playgroud)
这似乎是唯一的方法:
[^;]+ ';'
Run Code Online (Sandbox Code Playgroud)
哪种丑陋......还有其他方式吗?.+?似乎不起作用..
我不想重复Cthulhu的答案,但我希望使用Treetop匹配开启和关闭HTML标签的对.使用这个语法,我可以匹配开始标记和结束标记,但现在我想要一个规则将它们绑在一起.我已尝试过以下内容,但使用此方法会使我的解析器永远继续(无限循环):
rule html_tag_pair
html_open_tag (!html_close_tag (html_tag_pair / '' / text / newline /
whitespace))+ html_close_tag <HTMLTagPair>
end
Run Code Online (Sandbox Code Playgroud)
我试图将此基于递归括号示例和Treetop Github页面上的否定前瞻示例.我引用的其他规则如下:
rule newline
[\n\r] {
def content
:newline
end
}
end
rule tab
"\t" {
def content
:tab
end
}
end
rule whitespace
(newline / tab / [\s]) {
def content
:whitespace
end
}
end
rule text
[^<]+ {
def content
[:text, text_value]
end
}
end
rule html_open_tag
"<" html_tag_name attribute_list ">" <HTMLOpenTag>
end
rule html_empty_tag …Run Code Online (Sandbox Code Playgroud)