标签: treetop

用于Python样式缩进的PEG

您将如何在以下任何可以处理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)

syntax parsing language-design peg treetop

32
推荐指数
3
解决办法
5083
查看次数

学习树顶

我正在尝试自学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)

ruby grammar parsing treetop

18
推荐指数
2
解决办法
1万
查看次数

识别Treetop语法中的Ruby代码

我正在尝试使用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 grammar parsing erb treetop

8
推荐指数
1
解决办法
694
查看次数

Visual Studio Code:禁用特定文件类型的错误/警告检查

在工作中,我的团队使用 Ruby 和 Treetop 解析器创建了我们自己的小型脚本语言。该语言本身的语法与 Ruby 非常相似。

我正在使用 Ruby 和 Ruby 扩展来为我们的这种语言的文件进行语法高亮显示,但是 Ruby 扩展会引发错误,因为该语言实际上不是 Ruby。

有没有办法禁用特定文件类型的错误检查?我应该分叉 Ruby 扩展吗?

谢谢。

ruby treetop visual-studio-code

7
推荐指数
2
解决办法
1855
查看次数

Treetop的Vim缩进文件(Ruby解析器)

有没有人见过treetop的vim缩进文件,Ruby解析器/生成器?我发现了一个vim语法高亮显示文件,但没有看到缩进文件.

ruby vim indentation treetop

6
推荐指数
1
解决办法
860
查看次数

如何处理Treetop左递归

我有一个语法文件,用于我正在尝试构建的新通用编程语言.我正在尝试使语言健壮且自然地使用(它受到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)

对我来说,这似乎会有一个不同的问题,但仍然会失败.我是对的,还是这个"只是工作"?

我正在尝试(查找和)消除的特定左递归在此语法文件中找到.我不确定哪些规则受到影响,但至少有一些规则被指出有左递归.(顺便说一下,我试图通过收紧范围规则来消除他提到的具体范围问题.)

ruby abstract-syntax-tree treetop left-recursion

6
推荐指数
1
解决办法
578
查看次数

Treetop中的CSS/HSS解析器和嵌套样式表规则

我是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)

ruby treetop

5
推荐指数
1
解决办法
946
查看次数

树顶语法无限循环

我对于一种新的编程语言有了一些想法,所以我想我会尝试实现它.一位朋友建议我尝试使用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)

ruby abstract-syntax-tree treetop

5
推荐指数
2
解决办法
516
查看次数

树梢中最简单的规则不起作用

我有一个只有两条规则的树梢语法:

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.我无法理解这两个规则如何以任何方式重叠.这让我疯狂!

关于树梢或正则表达式,我是否缺少或不理解?在此先感谢您的帮助.

ruby peg treetop

4
推荐指数
1
解决办法
189
查看次数

Treetop/PEG中的非贪婪匹配?

我如何在Treetop中做这样的事情?

/.+?;/
Run Code Online (Sandbox Code Playgroud)

这似乎是唯一的方法:

[^;]+ ';'
Run Code Online (Sandbox Code Playgroud)

哪种丑陋......还有其他方式吗?.+?似乎不起作用..

regex treetop

3
推荐指数
2
解决办法
1122
查看次数

在Treetop语法中匹配标签对

我不想重复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)

ruby regex grammar parsing treetop

2
推荐指数
1
解决办法
729
查看次数