如何让 Coco/R 解析器不贪婪

发布于 2024-12-25 10:10:26 字数 546 浏览 2 评论 0原文

我的 ATG 文件定义了一个代码块,

Codeblock = "<#" {anychar} "#>"

当 Coco 生成的解析器遇到这样的块时:

<#
   a=5;
   print "Hello world!";
#>

令牌拾取

a=5;
print "Hello

这正是我想要的。

然而,当遇到这样的代码时:

<#
   a=5;
   print "Hello World";
#>
<#
   b=5;
   print "Foo Bar";
#>

The token, 贪婪地拿起

 a=5;
 print "Hello World";
 #>
 <#
   b=5;
   print "Foo Bar";

如何让 Coco/R 知道不要这样做?

My ATG file defines a code block as

Codeblock = "<#" {anychar} "#>"

When the Coco generated parser comes across a block like this:

<#
   a=5;
   print "Hello world!";
#>

The token picks up

a=5;
print "Hello

This is exactly what I want.

However, when it comes across code like this:

<#
   a=5;
   print "Hello World";
#>
<#
   b=5;
   print "Foo Bar";
#>

The token, greedily picks up

 a=5;
 print "Hello World";
 #>
 <#
   b=5;
   print "Foo Bar";

How can I let Coco/R know not to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

書生途 2025-01-01 10:10:26

试试这个:

codeblock = "<#" {anychar} "#>" .
anychar = (expression|procedure) ";" .

通过使anychar以“;”结尾那么 cocor 就不能错误地解析任何具有这种模式“#> <#”的字符

try this:

codeblock = "<#" {anychar} "#>" .
anychar = (expression|procedure) ";" .

by making anychar ended with ";" then cocor cannot mistakenly parse anychar with this pattern "#> <#"

静水深流 2025-01-01 10:10:26

您的终端需要更加明确。

“ANY”引入了歧义,这就是解析 #><# 的原因,您的代码块会将 FIRST <# 和 LAST #> 之间的所有内容视为是集合“ANY”的一部分,因为这就是您的语法定义代码块的方式。

也许尝试:

code = codeblock {codeblock} EOF
codeblock = "<#" {anychar} "#>"

Your terminals need to be more explicit.

"ANY" introduces ambiguity which is why the #><# is being parsed, your codeblock will treat everything between the FIRST <# and LAST #> as being part of the set "ANY" since that is how your grammar has defined a codeblock.

Perhaps try:

code = codeblock {codeblock} EOF
codeblock = "<#" {anychar} "#>"
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文