gpt4 book ai didi

java - ANTLR 解析未找到正确的词法分析器部分

转载 作者:行者123 更新时间:2023-12-01 09:23:28 24 4
gpt4 key购买 nike

我是 ANTLR 的新手。

我有以下 ANTLR 语法:

grammar DrugEntityRecognition;

// Parser Rules

derSentence : ACTION (INT | FRACTION | RANGE) FORM TEXT;

// Lexer Rules

ACTION : 'TAKE' | 'INFUSE' | 'INJECT' | 'INHALE' | 'APPLY' | 'SPRAY' ;

INT : [0-9]+ ;

FRACTION : [1] '/' [1-9] ;

RANGE : INT '-' INT ;

FORM : ('TABLET' | 'TABLETS' | 'CAPSULE' | 'CAPSULES' | 'SYRINGE') ;

TEXT : ('A'..'Z' | WHITESPACE | ',')+ ;

WHITESPACE : ('\t' | ' ' | '\r' | '\n' | '\u000C')+ -> skip ;

当我尝试按如下方式解析句子时:

String upperLine = line.toUpperCase();
org.antlr.v4.runtime.CharStream stream = new ANTLRInputStream(upperLine);
DrugEntityRecognitionLexer lexer = new DrugEntityRecognitionLexer(stream);
lexer.removeErrorListeners();
lexer.addErrorListener(ThrowingErrorListener.INSTANCE);

CommonTokenStream tokenStream = new CommonTokenStream(lexer);
DrugEntityRecognitionParser parser = new DrugEntityRecognitionParser(tokenStream);

try {
DrugEntityRecognitionParser.DerSentenceContext ctx = parser.derSentence();

StringBuilder sb = new StringBuilder();

sb.append("ACTION: ").append(ctx.ACTION());
sb.append(", ");
sb.append("FORM: ").append(ctx.FORM());
sb.append(", ");
sb.append("INT: ").append(ctx.INT());
sb.append(", ");
sb.append("FRACTION: ").append(ctx.FRACTION());
sb.append(", ");
sb.append("RANGE: ").append(ctx.RANGE());

System.out.println(upperLine);
System.out.println(sb.toString());

} catch (ParseCancellationException e) {
//e.printStackTrace();
}

词法分析器的输入示例:

take 10 Tablet (25MG)  by oral route  every week

在这种情况下,ACTION 节点未填充,但 take 仅被识别为 TEXT 节点,而不是 ACTION 节点。然而,10 被识别为 INT 节点。

如何修改此语法才能正常工作,其中 ACTION 节点正确填充(以及 FORM,也没有填充)?

最佳答案

你的语法有几个问题:

  1. 您的 TEXT 规则仅匹配大写字母。行动也是如此。
  2. 您不应在单个文本规则中混合标点符号和文本(此处为逗号),否则您无法随意允许标记之间有空格。
  3. 您根本不匹配括号,因此 (25MG) 不是有效输入,解析器会返回错误状态。
  4. 您没有检查任何语法错误,以了解识别过程中出现的问题。

此外,当有疑问时,请始终从 token 源打印 token 序列,以查看输入是否实际上已按照您的预期进行 token 化。在进入解析器之前从这里开始修复语法。

关于区分大小写:通常(如果您的语言不区分大小写)您有如下规则:

fragment A: [aA];
fragment B: [bB];
fragment C: [cC];
fragment D: [dD];
...

匹配任一情况下的字母,然后定义关键字:

ACTION : T A K E | I N F U S E | I N J E C T |  I N H A L E | A P P L Y  | S P R A Y;

关于java - ANTLR 解析未找到正确的词法分析器部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40005643/

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