如何组合来自不同词法分析器语法的 ANTLR 词法分析器规则?

How do I combine ANTLR lexer rules from different lexer grammars?

我正在玩 ANTLR 并构建像 jsx 这样的 DSL。

但是在 jsx 中,{} 中有 javasciprt 表达式,我如何在词法分析器语法中定义这些 ECMAScript 规则?我应该从头开始重写整个 ECMAScript 词法分析器,还是有一些方法可以在我的词法分析器语法中导入这些规则?

<div class={javasciprt expression in here}></div>

你可以使用 lexical modes

lexer grammar YourCurrentLexer;

EXISTING_TOKEN
 : '...' 
 ;

// other tokens

ECMA_START
 : '{' -> pushMode(ECMA_MODE)
 ;

mode ECMA_MODE;

 ECMA_TOKEN
  : '...'
  ;

 // other ECMA tokens
 
 // Support nested { ... }
 OPEN_BRACE
  : '{' -> pushMode(ECMA_MODE)
  ;

 CLOSE_BRACE
  : '}' -> popMode
  ;

Should I rewrite the whole ECMAScript lexer from scratch or there are some ways to import those rules in my lexer grammar?

您不能只在词法模式中导入现有语法。只需复制粘贴您想要的规则:https://github.com/antlr/grammars-v4/blob/master/javascript/ecmascript/JavaScript/ECMAScript.g4