Input:
Output:
<aside> 💡 三种设计方法
词法分析器生成器 (e.g. ANTLR)
$\tt spec. ⇒ ANTLR ⇒ lexer$
手写词法分析器
自动化词法分析器
Write an ANTLR-like generator on your own
GCC 仍旧使用手写词法分析器,效率更高,且复杂度可控
</aside>
antlr4/index.md at master · antlr/antlr4
输入: 词法单元的规约
$\texttt{antlr4 SimpleExpr.g4}$
输出: 词法分析器
$\texttt{SimpleExpr.tokens + SimpleExprLexer.java}$
antlr4/lexicon.md at master · antlr/antlr4
antlr4/grammars.md at master · antlr/antlr4
最高层语法结构 $\texttt{prog ::= \{<stat>...\}; [EOF]}$
语句 $\texttt{stat ::= \{<expr>|<ID>|<token>\}...}$
表达式 $\texttt{expr ::= \{<expr>|<ID>|<token>\}...}$
词法单元 $\texttt{ID ::= \{<fragment>|<token>\}...}$
\texttt{\db{fragment} LETTER}$
WS: [ \\t\\r\\n]+ -> skip
跳过空白符.*?
<aside> 💡 ANTLR v4 中两大冲突解决规则
>=
, ifhappy
, thenext
, 1.23
</aside>