gpt4 book ai didi

perl - Marpa:我可以明确禁止关键字作为标识符吗?

转载 作者:行者123 更新时间:2023-12-04 15:22:07 27 4
gpt4 key购买 nike

我正在 Marpa 中实现一个新的 DSL,并且(来自 Regexp::Grammars)我非常满意。我的语言支持一堆一元和二元运算符、带有 C 样式标识符的对象和使用熟悉的点符号的方法调用。例如:
foo.has(bar == 42 AND baz == 23)

我找到了 prioritized rules Marpa 的语法描述语言提供的特性,并且已经非常依赖它,所以我几乎只有一个 G1 规则 Expression .摘录(许多替代方案,为简洁起见省略了语义操作):

Expression ::=
NumLiteral
| '(' Expression ')' assoc => group
|| Expression ('.') Identifier
|| Expression ('.') Identifier Args
| Expression ('==') Expression
|| Expression ('AND') Expression

Args ::= ('(') ArgsList (')')
ArgsList ::= Expression+ separator => [,]

Identifier ~ IdentifierHeadChar IdentifierBody
IdentifierBody ~ IdentifierBodyChar*
IdentifierHeadChar ~ [a-zA-Z_]
IdentifierBodyChar ~ [a-zA-Z0-9_]

NumLiteral ~ [0-9]+

如您所见,我使用的是无扫描界面 (SLIF)。我的问题是这也解析,例如:
foo.AND(5)

马尔巴知道点后只能有一个标识符,所以它甚至没有考虑 AND这个事实。可能是关键字。我知道我可以通过做一个单独的词法阶段来识别 AND 来避免这个问题。作为明确的关键字,但那个小小的 Papercut 并不值得付出努力。

SLIF 有没有办法限制 Identifier规则仅适用于非关键字标识符?

最佳答案

我不知道如何用语法表达这样的东西。您可以为 Identifier 引入一个中间非终端来检查条件,但是:

#!/usr/bin/perl
use warnings;
use strict;
use Syntax::Construct qw{ // };

use Marpa::R2;

my %reserved = map { $_ => 1 } qw( AND );

my $grammar = 'Marpa::R2::Scanless::G'->new(
{ bless_package => 'main',
source => \( << '__GRAMMAR__'),

:default ::= action => store

:start ::= S
S ::= Id
| Id NumLiteral
Id ::= Identifier action => allowed

Identifier ~ IdentifierHeadChar IdentifierBody
IdentifierBody ~ IdentifierBodyChar*
IdentifierHeadChar ~ [a-zA-Z_]
IdentifierBodyChar ~ [a-zA-Z0-9_]

NumLiteral ~ [0-9]+

:discard ~ whitespace
whitespace ~ [\s]+

__GRAMMAR__
});

for my $value ('ABC', 'ABC 42', 'AND 1') {
my $value = $grammar->parse(\$value, 'main');
print $$value, "\n";
}


sub store {
my (undef, $id, $arg) = @_;
$arg //= 'null';
return "$id $arg";
}

sub allowed {
my (undef, $id) = @_;
die "Reserved keyword $id" if $reserved{$id};
return $id
}

关于perl - Marpa:我可以明确禁止关键字作为标识符吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27109840/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com