Antlr4在jsx中解析templateLiteral [英] Antlr4 parsing templateLiteral in jsx

查看:31
本文介绍了Antlr4在jsx中解析templateLiteral的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试使用在grammars-v4项目中定义的语法(

I have tried to use grammar defined in grammars-v4 project(https://github.com/antlr/grammars-v4/tree/master/javascript/jsx) to parse jsx file. When I parse the code snippet below,

let str =
        `${dsName}${parameterStr ? `( ${parameterStr} )` : ""}${returns ? `{
${returns}}` : ""}`;

it shows the following error

 line 2:32 at [@8,42:42='(',<8>,2:32]:no viable alternative at input '('

https://astexplorer.net/ shows it is a TemplateLiteral with conditionalExpression inside, any thoughts for parsing such grammar?

Thanks in advance.

Edit: Thanks @Bart, it works.

It works fine on the following code.

const href1 = `https://example.com/lib/downloads_${page}.htm?joinSource=${joinSource}${inviter?`&inviter=${inviter}`: ''}`;

const href2 = `https://example.com/act/kol/detail_${this.props.values.list.res.rows && this.props.values.list.res.rows[0].id}_${page}.htm?joinSource=${joinSource}${inviter?`&inviter=${inviter}`: ''}`;

解决方案

Given Mike's observation that it's the template string that is messing things up, here's a quick solution:

Changes:

JavaScriptLexerBase.java

Add the instance variable:

// Keeps track of the the current depth of nested template string backticks. 
// E.g. after the X in:
// 
// `${a ? `${X
//
// templateDepth will be 2. This variable is needed to determine if a `}` is a 
// plain CloseBrace, or one that closes an expression inside a template string. 
protected int templateDepth = 0;

JavaScriptLexer.g4

// Place TemplateCloseBrace above CloseBrace!
TemplateCloseBrace: {this.templateDepth > 0}? '}' -> popMode;

...

// Remove (or comment) TemplateStringLiteral
// TemplateStringLiteral:          '`' ('\\`' | ~'`')* '`';

BackTick
    : '`' {this.templateDepth++;} -> pushMode(TEMPLATE)
    ;

...

// Place at the end of the file:
mode TEMPLATE;

BackTickInside
    : '`' {this.templateDepth--;} -> type(BackTick), popMode
    ;

TemplateStringStartExpression
    : '${' -> pushMode(DEFAULT_MODE)
    ;

TemplateStringAtom
    : ~[`]
    ;

JavaScriptParser.g4

singleExpression
    : ...
    | singleExpression templateStringLiteral    # TemplateStringExpression  // ECMAScript 6
    | ...
    ;

literal
    : ...
    | templateStringLiteral
    | ...
    ;

templateStringLiteral
    : BackTick templateStringAtom* BackTick
    ;

templateStringAtom
    : TemplateStringAtom
    | TemplateStringStartExpression singleExpression TemplateCloseBrace
    ;

I did not fully test my solution, but it parses your example input successfully:

这篇关于Antlr4在jsx中解析templateLiteral的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆