gpt4 book ai didi

java - ANTLR:词法分析器规则严格接受一个字母和多个字符的标记,而不是仅接受一个(Java)

转载 作者:太空宇宙 更新时间:2023-11-04 08:44:21 24 4
gpt4 key购买 nike

我已经为 ANTLR 解析器和词法分析器编写了以下语法,用于为逻辑公式构建树,并且有几个问题,如果有人可以帮忙:

class AntlrFormulaParser extends Parser;

options {
buildAST = true;
}

biconexpr : impexpr (BICONDITIONAL^ impexpr)*;

impexpr : orexpr (IMPLICATION^ orexpr)*;

orexpr : andexpr (DISJUNCTION^ andexpr)*;

andexpr : notexpr (CONJUNCTION^ notexpr)*;

notexpr : (NEGATION^)? formula;

formula
: atom
| LEFT_PAREN! biconexpr RIGHT_PAREN!
;

atom
: CHAR
| TRUTH
| FALSITY
;


class AntlrFormulaLexer extends Lexer;

// Atoms
CHAR: 'a'..'z';
TRUTH: ('\u22A4' | 'T');
FALSITY: ('\u22A5' | 'F');

// Grouping
LEFT_PAREN: '(';
RIGHT_PAREN: ')';
NEGATION: ('\u00AC' | '~' | '!');
CONJUNCTION: ('\u2227' | '&' | '^');
DISJUNCTION: ('\u2228' | '|' | 'V');
IMPLICATION: ('\u2192' | "->");
BICONDITIONAL: ('\u2194' | "<->");

WHITESPACE : (' ' | '\t' | '\r' | '\n') { $setType(Token.SKIP); };

树语法:

tree grammar AntlrFormulaTreeParser;

options {
tokenVocab=AntlrFormula;
ASTLabelType=CommonTree;
}

expr returns [Formula f]
: ^(BICONDITIONAL f1=expr f2=expr) {
$f = new Biconditional(f1, f2);
}
| ^(IMPLICATION f1=expr f2=expr) {
$f = new Implication(f1, f2);
}
| ^(DISJUNCTION f1=expr f2=expr) {
$f = new Disjunction(f1, f2);
}
| ^(CONJUNCTION f1=expr f2=expr) {
$f = new Conjunction(f1, f2);
}
| ^(NEGATION f1=expr) {
$f = new Negation(f1);
}
| CHAR {
$f = new Atom($CHAR.getText());
}
| TRUTH {
$f = Atom.TRUTH;
}
| FALSITY {
$f = Atom.FALSITY;
}
;

我在使用上述语法时遇到的问题是:

  1. AntlrFormulaLexer 的 java 代码中的标记 IMPLICATION 和 BICONDITIONAL 似乎仅检查其各自的第一个字符(即“-”和“<”)以匹配标记,而不是按照语法中指定的整个字符串。

  2. 在测试 AntlrFormulaParser 的 java 代码时,如果我传递一个诸如“~ab”之类的字符串,它会返回一棵“(~ a)”树(字符串“ab&c”仅返回“a”),而实际上它应该返回错误/异常,因为根据上述语法,一个原子只能有一个字母。这些示例字符串根本不会给出任何错误/异常。

如果有人能帮助我解决这两个问题,我将非常感激。谢谢:)

最佳答案

我会将以下定义更改为:

IMPLICATION: ('\u2192' | '->');
BICONDITIONAL: ('\u2194' | '<->');

注意“->”与“->”

并解决错误问题:

formula 
: (
atom
| LEFT_PAREN! biconexpr RIGHT_PAREN!
) EOF
;

从这里开始: http://www.antlr.org/wiki/pages/viewpage.action?pageId=4554943

修复了针对 antlr 3.3 进行编译的语法(另存为 AntlrFormula.g):

grammar AntlrFormula;

options {
output = AST;
}


program : formula ;

formula : atom | LEFT_PAREN! biconexpr RIGHT_PAREN! ;

biconexpr : impexpr (BICONDITIONAL^ impexpr)*;

impexpr : orexpr (IMPLICATION^ orexpr)*;

orexpr : andexpr (DISJUNCTION^ andexpr)*;

andexpr : notexpr (CONJUNCTION^ notexpr)*;

notexpr : (NEGATION^)? formula;


atom
: CHAR
| TRUTH
| FALSITY
;


// Atoms
CHAR: 'a'..'z';
TRUTH: ('\u22A4' | 'T');
FALSITY: ('\u22A5' | 'F');

// Grouping
LEFT_PAREN: '(';
RIGHT_PAREN: ')';
NEGATION: ('\u00AC' | '~' | '!');
CONJUNCTION: ('\u2227' | '&' | '^');
DISJUNCTION: ('\u2228' | '|' | 'V');
IMPLICATION: ('\u2192' | '->');
BICONDITIONAL: ('\u2194' | '<->');

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

链接到 antlr 3.3 二进制文件:http://www.antlr.org/download/antlr-3.3-complete.jar

您需要尝试匹配程序规则才能匹配完整的文件。

可使用此类进行测试:

import org.antlr.runtime.*;

public class Main {
public static void main(String[] args) {
AntlrFormulaLexer lexer = new AntlrFormulaLexer(new ANTLRStringStream("(~ab)"));
AntlrFormulaParser p = new AntlrFormulaParser(new CommonTokenStream(lexer));

try {
p.program();
if ( p.failed() || p.getNumberOfSyntaxErrors() != 0) {
System.out.println("failed");
}
} catch (RecognitionException e) {
e.printStackTrace();
}
}
}

关于java - ANTLR:词法分析器规则严格接受一个字母和多个字符的标记,而不是仅接受一个(Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4642986/

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