标签: tree-grammar

如何在PHP中解析Markdown?

首先,我知道,已经有一个用于PHP的Markdown解析器.我也看了一下这个问题,但它没有回答我的问题.

显然,即使标题提到PHP,如果它是语言不可知的,因为我想知道我要做的步骤是什么.

我读过关于PEG的内容,但我承认,我并不真正理解PHP解析器提供的示例.

我也读过关于CFG的文章.

我发现Zend_Markup_Parser_Textile似乎构造了一个所谓的"令牌树"(它是什么?)但它目前无法使用.(顺便说一句,纺织品不是降价)

那么,具体来说,你会怎么做呢?

显然我虽然使用正则表达式,但我害怕.

因为Markdown支持同一元素的几种语法(Setext和atx).

你能给出一些起点吗?

language-agnostic markdown parsing tree-grammar

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

生成ANTLR树语法的系统方法?

我有一个很大的ANTLR解析器语法文件,并希望为它创建一个树语法.但是,据我所知,这种树语法生成的工作不能自动完成,即我应该通过复制解析器语法,删除一些不必要的代码等手动生成它.我想知道是否有系统的方法来从解析器语法文件生成树语法文件.

PS我读了一篇坚持" 手工树行走比树语法更好 "的文章.这是可靠的信息吗?如果是这样,制作手动树步行器比编写ANTLR树语法文件更好吗?然后,如何使用我的ANTLR解析器语法文件创建一个手动树行走器(它使用重写规则制作AST)?

提前致谢.

antlr tree-grammar

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

ANTLR的AST树语法+列表

我已经阅读了很多试图找到一种方法来干净地使用ANTLR的树语法中的列表.这是我尝试过的和他们的结果(我真的希望我错过了一些微不足道的事情)......

使用+ =语法

program returns [someInterface result]
  : m+=method* EOF {result = new SomeClass(m);};

method returns [SomeMethod result] : <definition here>
Run Code Online (Sandbox Code Playgroud)

这失败了......

规则'+ ='列表标签不允许没有输出选项

如果我将输出设置为"AST"或"template"(唯一选项),则生成的类的方法签名会更改.也就是说,m不是由SomeMethod列表,而是分别是节点或模板列表.如果有办法使这种方法有效,我愿意接受建议.

使用规则范围

program returns [CompilesToJavaByteCode result]
    scope {
      List<SomeMethod> methods;
    }
    @init {
      $program::methods = new ArrayList<SomeMethod>();
    }
    : (m=method {$program::methods.add(m);})*
      EOF {result = new SomeClass($program::methods);};
Run Code Online (Sandbox Code Playgroud)

这似乎有效,但我承认我还没有用嵌套/递归的情况测试它.

最终目标

我想构建一组代表我的语言的类(Class,Method,Variable,Statement,ect),这样我就可以在生成编译代码之前做一些静态分析和优化.为此,我需要能够使用列表.我希望+ =语法"正常工作",但我可能会遗漏一些东西.第二种方法有效,但看起来过于冗长和不优雅.

问题

在ANTLR的树语法中使用列表传递给我的具体类的原因是什么?

antlr antlr3 tree-grammar

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