gpt4 book ai didi

parsing - 在 ANTLR 中,是否有表示一组规则的所有排列的交替的快捷符号?

转载 作者:行者123 更新时间:2023-12-03 14:05:53 24 4
gpt4 key购买 nike

在 ANTLR 中,我想定义这样的规则:

规则:( a b c | a c b | b a c | b c a | c a b | c b a );

但在我的情况下,我有 10 条规则,而不是 3 条,我想对它们进行置换,因此它变得非常不切实际。
有没有办法在 ANTLR 中表达这一点而不必编写所有排列?

最佳答案

我会匹配任何 a , bc一次或多次:

rule
: ( a | b | c )+
;

然后,在解析之后,遍历解析树并检查是否 a , bc全部匹配一次。

但是是的,通过在需要的地方使用谓词,在语法本身中是可能的。

一个演示:

grammar Permutation;

parse
: permutation[5] {System.out.println("parsed: " + $permutation.text);} EOF
;

permutation[final int n]
@init{
java.util.Set set = new java.util.HashSet();
int counter = n;
}
: (
{counter > 0}?=> token // keep matching a `token` as long as `counter > 0`
{ //
set.add($token.text); // add the contents of `token` to `set`
counter--; // decrease `counter`
} //
)+
{set.size() == n}? // if `set.size() != n`, an exception is thrown
;

token
: A
| B
| C
| D
| E
;

A : 'A';
B : 'B';
C : 'C';
D : 'D';
E : 'E';

Space : ' ' {skip();};

上面的演示语法使用了 2 种不同类型的谓词: 1) 门控语义谓词 i 以确保 permutation规则匹配不超过参数 final int n token 和 2) 验证语义谓词 i 以确保 set正好持有 final int n元素以确保它是 5 个标记的正确排列。

更多关于语义谓词的信息可以在这里找到: What is a 'semantic predicate' in ANTLR?

您可以使用以下类测试语法:

import org.antlr.runtime.*;

public class Main {
public static void main(String[] args) throws Exception {
PermutationLexer lexer = new PermutationLexer(new ANTLRStringStream(args[0]));
PermutationParser parser = new PermutationParser(new CommonTokenStream(lexer));
parser.parse();
}
}

java -cp antlr-3.3.jar org.antlr.Tool Permutation.g 
javac -cp antlr-3.3.jar *.java

java -cp .:antlr-3.3.jar Main "A B C D E"
parsed: ABCDE

java -cp .:antlr-3.3.jar Main "B D C E A"
parsed: BDCEA

java -cp .:antlr-3.3.jar Main "A B C D B"
line 1:9 rule permutation failed predicate: {set.size() == n}?
parsed: null

关于parsing - 在 ANTLR 中,是否有表示一组规则的所有排列的交替的快捷符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6883992/

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