当前位置: 首页 > 知识库问答 >
问题:

ANTLR4-在JavaScript语法中解析regex文本

吴丁雷
2023-03-14

我只剩下一个问题:我不知道如何处理RegEx文本的转角情况,如下所示:

log(Math.round(v * 100) / 100 + ' msec/sample');

/100+'msec/被解释为RegEx文本,因为lexer规则始终处于活动状态。

我想要的是合并这个逻辑(C#代码。我需要JavaScript,但我不知道如何修改它):

    /// <summary>
    /// Indicates whether regular expression (yields true) or division expression recognition (false) in the lexer is enabled.
    /// These are mutual exclusive and the decision which is active in the lexer is based on the previous on channel token.
    /// When the previous token can be identified as a possible left operand for a division this results in false, otherwise true.
    /// </summary>
    private bool AreRegularExpressionsEnabled
    {
        get
        {
            if (Last == null)
            {
                return true;
            }

            switch (Last.Type)
            {
                // identifier
                case Identifier:
                // literals
                case NULL:
                case TRUE:
                case FALSE:
                case THIS:
                case OctalIntegerLiteral:
                case DecimalLiteral:
                case HexIntegerLiteral:
                case StringLiteral:
                // member access ending 
                case RBRACK:
                // function call or nested expression ending
                case RPAREN:
                    return false;

                // otherwise OK
                default:
                    return true;
            }
        }
    }
RegularExpressionLiteral
    : { AreRegularExpressionsEnabled }?=> DIV RegularExpressionFirstChar RegularExpressionChar* DIV IdentifierPart*
    ;

共有1个答案

史旺
2023-03-14

我在这里发布最终的解决方案,它将现有的解决方案与ANTLR4的新语法相适应,并解决了JavaScript语法中的差异。

我只是张贴相关的部分,给其他人一个关于工作策略的线索。

规则编辑如下:

RegularExpressionLiteral
    : DIV {this.isRegExEnabled()}? RegularExpressionFirstChar RegularExpressionChar* DIV IdentifierPart*
    ;
@members {
EcmaScriptLexer.prototype.nextToken = function() {
  var result = antlr4.Lexer.prototype.nextToken.call(this, arguments);
  if (result.channel !== antlr4.Lexer.HIDDEN) {
    this._Last = result;
  }

  return result;
}

EcmaScriptLexer.prototype.isRegExEnabled = function() {
  var la = this._Last ? this._Last.type : null;
  return la !== EcmaScriptLexer.Identifier &&
    la !== EcmaScriptLexer.NULL &&
    la !== EcmaScriptLexer.TRUE &&
    la !== EcmaScriptLexer.FALSE &&
    la !== EcmaScriptLexer.THIS &&
    la !== EcmaScriptLexer.OctalIntegerLiteral &&
    la !== EcmaScriptLexer.DecimalLiteral &&
    la !== EcmaScriptLexer.HexIntegerLiteral &&
    la !== EcmaScriptLexer.StringLiteral &&
    la !== EcmaScriptLexer.RBRACK &&
    la !== EcmaScriptLexer.RPAREN;
}}
 类似资料:
  • 亲爱的Antlr4社区, 解析似乎很顺利: 但是,我得到以下错误消息: 错误是: [1]交换量子精确和正态分布的定义。但是交换在第一个输入中引入了一个错误: 因为在这种情况下,'6'只被视为一个正态分布,而不是一个全精确值。 [2]尝试为Quanteact(数量的花括号)创建一个上下文,这样lexer只在这个有限的上下文中提供Quanteact符号。但是我没有为此找到ANTLR4原语。 所以似乎什

  • 我对ANTLR相对来说是新的,所以请原谅我。 但是当我试图解析下面的表达式时 我最终出现以下错误: 第1:38行:'''处的令牌识别错误 第1:42行:'''处的令牌识别错误 规则r没有方法或者它有参数 规则'r'的意思是什么?我怎么能理解问题的原因呢?任何帮助都将不胜感激!

  • 我试图使用ANTLR4在golang创建一个javascript解析器。我使用的语法是这样的(https://github.com/antlr/grammars-v4/tree/master/javascript/ecmascript),我遵循自述文件https://github.com/antlr/antlr4/blob/master/doc/go-target.md中的说明 因此,我从语法中生

  • 我正在为用ANTLR4编写的Decaf编程语言创建解析器和lexer规则。我试图解析一个测试文件,但不断地得到一个错误,一定是语法有问题,但我无法理解。 我的测试文件如下所示: 错误是:第2行:8不匹配的输入“10”应为INT_LITERAL 下面是完整的decaf.g4语法文件

  • 我有一个利用CharsAsTokens人造lexer的无扫描解析器语法,它为ANTLR4到4.6版本生成了一个可用的Java解析器类。但是,当更新到ANTLR 4.7.2到4.9.3-Snapshot时,该工具会生成代码,从相同的语法文件产生数十个编译错误,如下所述。 我这里的问题很简单:是否不再支持无扫描解析器语法,或者必须在4.7和更高版本中以不同的方式指定基于字符的终端? 更新: 不幸的是,

  • 但我看不出这两个规则中有任何空字符串的可能性。还是我错了?这个代码有什么问题?