【问题标题】:ANTLR4 - arguments in nested functionsANTLR4 - 嵌套函数中的参数
【发布时间】:2019-11-28 21:28:55
【问题描述】:

我的 antlr 语法或(词法分析器)有问题。就我而言,我需要用自定义文本解析一个字符串并在其中查找函数。函数$foo($bar(3),'strArg')的格式。我在这篇帖子ANTLR Nested Functions 中找到了解决方案,并根据我的需要对其进行了一些改进。但是在测试不同的案例时,我发现了一个会阻止解析器的案例:$foo($3,'strArg')。这将引发 IncorectSyntax 异常。我尝试了许多变体(例如,不要跳过 $ 并将其包含在解析树中)但所有这些尝试都没有成功

词法分析器

lexer grammar TLexer;

TEXT
 : ~[$]
 ;

FUNCTION_START
 : '$' -> pushMode(IN_FUNCTION), skip
 ;

mode IN_FUNCTION;
  FUNTION_NESTED : '$' -> pushMode(IN_FUNCTION), skip;
  ID             : [a-zA-Z_]+;
  PAR_OPEN       : '(';
  PAR_CLOSE      : ')' -> popMode;
  NUMBER         : [0-9]+;
  STRING         : '\'' ( ~'\'' | '\'\'' )* '\'';
  COMMA          : ',';
  SPACE          : [ \t\r\n]-> skip;

解析器


options {
  tokenVocab=TLexer;
}

parse
 : atom* EOF
 ;

atom
 : text
 | function
 ;

text
 : TEXT+
 ;

function
 : ID params
 ;

params
 : PAR_OPEN ( param ( COMMA param )* )? PAR_CLOSE
 ;

param
 : NUMBER
 | STRING
 | function
 ;

【问题讨论】:

  • 3 不是正确的函数名(定义为ID,即[a-zA-Z_]+)。
  • 对于虚假信息,我深表歉意。我的意思是这是$foo($3) 不正确的情况,但解析器不会在$3 处失败(对于解析器,它看起来像NUMBER 非终端),如果您添加更多文本$foo($3) and some more text,它将失败。我不明白这是因为$ 跳过而你仍然处于IN_FUNCTION 模式

标签: java parsing antlr ll


【解决方案1】:

解析器不会在$foo($3,'strArg') 上失败,因为当它遇到第二个$ 时,它已经处于IN_FUNCTION 模式并且它正在等待一个参数。它跳过字符并读取NUMBER

如果您希望它失败,您需要取消跳过 Lexer 中的美元符号:

FUNCTION_START : '$' -> pushMode(IN_FUNCTION);

mode IN_FUNCTION;
    FUNTION_START : '$' -> pushMode(IN_FUNCTION);

并修改function规则:

function : FUNCTION_START ID params;

【讨论】:

  • 非常感谢!你帮我找到解决办法。但必须对解析器function : (FUNCTION_START|FUNTION_NESTED) ID params;进行一点修改;效果很好
  • 是的,在我的回答中,我更改了FUNCTION_NESTED 的名称,但没有提及。
猜你喜欢
  • 1970-01-01
  • 2014-02-27
  • 2021-12-01
  • 2013-12-20
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
相关资源
最近更新 更多