parser-generator - PEG 和空格/注释

标签 parser-generator peg

我有一些用 ANTLR 编写解析器的经验,我正在尝试(为了自我教育:))将其中一个移植到 PEG(解析表达式语法)。

当我试图了解这个想法时,有一件事让我觉得很麻烦,以至于我觉得我错过了一些东西:如何处理空白。

在 ANTLR 中,处理空格和注释的正常方法是将标记放在隐藏 channel 中,但使用 PEG 语法没有标记化步骤。考虑到诸如 C 或 Java 之类的语言,几乎所有地方都允许注释,人们希望立即“隐藏”注释,但由于注释可能具有语义含义(例如在生成代码文档、类图等时),不只是想丢弃它们。

那么,有没有办法解决这个问题?

最佳答案

因为没有单独的标记化阶段,所以没有“时间”丢弃某些字符(或标记)。

由于您熟悉 ANTLR,可以这样想:假设 ANTLR 仅处理 PEG。所以你只有解析器规则,没有词法规则。现在你将如何丢弃,比如说,空格? (你不能)。

所以,你的问题的答案是:你不能,你必须在 PEG 中用空格规则乱扔你的语法:

ANTLR

add_expr
 : Num Add Num
 ;

Add   : '+';
Num   : '0'..'9'+;
Space : ' '+ {skip();};

聚乙二醇
add_expr
 : num _ '+' _ num
 ;

num : '0'..'9'+;
_   : ' '*;

关于parser-generator - PEG 和空格/注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10072451/

相关文章:

javascript - 在 PEG.js 中指定数量

python - 在琶音中实现节点变压器

rust - 使用 Pest.rs 如何管理一行以 "\"结尾的多行语法?

parsing - 使用 LPEG (Lua Parser Expression Grammars) 像 boost::spirit

javascript - 这个语法怎么有歧义?

parsing - 编程语言解析器的来源?

parsing - 解析器错误恢复可以由语法自动引导吗?

c++ - 我怎样才能阻止我的简单加法语法在 Boost Spirit 中提前终止?

java - EDIFACT 语法、解析器和库 (Java)

javascript - 在Jison中调试