gpt4 book ai didi

java - 正则表达式 - 树语法 Antlr Java

转载 作者:太空宇宙 更新时间:2023-11-04 07:56:12 27 4
gpt4 key购买 nike

我正在尝试用 ANTLR (Java) 编写一个关于简化正则表达式的程序。我已经写了一些代码(下面的语法文件内容)

grammar Regexp_v7;
options{
language = Java;
output = AST;
ASTLabelType = CommonTree;
backtrack = true;
}

tokens{
DOT;
REPEAT;
RANGE;
NULL;
}

fragment
ZERO
: '0'
;

fragment
DIGIT
: '1'..'9'
;

fragment
EPSILON
: '@'
;

fragment
FI
: '%'
;

ID
: EPSILON
| FI
| 'a'..'z'
| 'A'..'Z'
;

NUMBER
: ZERO
| DIGIT (ZERO | DIGIT)*
;

WHITESPACE
: ('\r' | '\n' | ' ' | '\t' ) + {$channel = HIDDEN;}
;

list
: (reg_exp ';'!)*
;

term
: ID -> ID
| '('! reg_exp ')'!
;

repeat_exp
: term ('{' range_exp '}')+ -> ^(REPEAT term (range_exp)+)
| term -> term
;

range_exp
: NUMBER ',' NUMBER -> ^(RANGE NUMBER NUMBER)
| NUMBER (',') -> ^(RANGE NUMBER NULL)
| ',' NUMBER -> ^(RANGE NULL NUMBER)
| NUMBER -> ^(RANGE NUMBER NUMBER)
;
kleene_exp
: repeat_exp ('*'^)*
;
concat_exp
: kleene_exp (kleene_exp)+ -> ^(DOT kleene_exp (kleene_exp)+)
| kleene_exp -> kleene_exp
;

reg_exp
: concat_exp ('|'^ concat_exp)*
;

我的下一个目标是写下树语法代码,它能够简化正则表达式(例如 a|a -> a 等)。我已经完成了一些编码(请参阅下面的文本),但是在定义将节点视为子树的规则时遇到了麻烦(为了简化以下类型的表达式,例如: (a|a)|(a|a) 到 a 等)

tree grammar Regexp_v7Walker;

options{
language = Java;
tokenVocab = Regexp_v7;
ASTLabelType = CommonTree;
output=AST;
backtrack = true;
}

tokens{
NULL;
}

bottomup
: ^('*' ^('*' e=.)) -> ^('*' $e) //a** -> a*
| ^('|' i=.* j=.* {$i.tree.toStringTree() == $j.tree.toStringTree()} )
-> $i // There are 3 errors while this line is up and running:
// 1. CommonTree cannot be resolved,
// 2. i.tree cannot be resolved or is not a field,
// 3. i cannot be resolved.
;

小型驱动程序类:

public class Regexp_Test_v7 {
public static void main(String[] args) throws RecognitionException {
CharStream stream = new ANTLRStringStream("a***;a|a;(ab)****;ab|ab;ab|aa;");
Regexp_v7Lexer lexer = new Regexp_v7Lexer(stream);
CommonTokenStream tokenStream = new CommonTokenStream(lexer);
Regexp_v7Parser parser = new Regexp_v7Parser(tokenStream);
list_return list = parser.list();
CommonTree t = (CommonTree) list.getTree();
System.out.println("Original tree: " + t.toStringTree());
CommonTreeNodeStream nodes = new CommonTreeNodeStream(t);
Regexp_v7Walker s = new Regexp_v7Walker(nodes);
t = (CommonTree)s.downup(t);
System.out.println("Simplified tree: " + t.toStringTree());

有人可以帮我解决这个案子吗?提前致谢并致以问候。

最佳答案

现在,我不是专家,但在你的树语法中:

  1. 添加filter=true
  2. bottomup规则的第二行更改为:
    ^('|' i=.j=.{i.toStringTree().equals(j.toStringTree()) }?) -> $i }

如果我没记错的话,使用 i=.* 就是允许 i 不存在,并且在转换为 String 时会出现 NullPointerException

ij 都是 CommonTree 类型,因为您已按以下方式设置它:ASTLabelType = CommonTree,因此您应该调用 i.toStringTree()

由于它是 Java 并且您要比较字符串,因此请使用 equals()

此外,为了使大括号中的表达式成为谓词,您需要在结束括号后加一个问号。

关于java - 正则表达式 - 树语法 Antlr Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13594376/

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