java - 为什么我的 antlr lexer java 类是 "code too large"?

标签 java antlr antlr3

这是 Antlr 中的词法分析器(对不起,文件很长):

lexer grammar SqlServerDialectLexer;
/* T-SQL words */
AND: 'AND';
BIGINT: 'BIGINT';
BIT: 'BIT';
CASE: 'CASE';
CHAR: 'CHAR';
COUNT: 'COUNT';
CREATE: 'CREATE';
CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP';
DATETIME: 'DATETIME';
DECLARE: 'DECLARE';
ELSE: 'ELSE';
END: 'END';
FLOAT: 'FLOAT';
FROM: 'FROM';
GO: 'GO';
IMAGE: 'IMAGE';
INNER: 'INNER';
INSERT: 'INSERT';
INT: 'INT';
INTO: 'INTO';
IS: 'IS';
JOIN: 'JOIN';
NOT: 'NOT';
NULL: 'NULL';
NUMERIC: 'NUMERIC';
NVARCHAR: 'NVARCHAR';
ON: 'ON';
OR: 'OR';
SELECT: 'SELECT';
SET: 'SET';
SMALLINT: 'SMALLINT';
TABLE: 'TABLE';
THEN: 'THEN';
TINYINT: 'TINYINT';
UPDATE: 'UPDATE';
USE: 'USE';
VALUES: 'VALUES';
VARCHAR: 'VARCHAR';
WHEN: 'WHEN';
WHERE: 'WHERE';

QUOTE: '\'' { textMode = !textMode; };
QUOTED: {textMode}?=> ~('\'')*;

EQUALS: '=';
NOT_EQUALS: '!=';
SEMICOLON: ';';
COMMA: ',';
OPEN: '(';
CLOSE: ')';
VARIABLE: '@' NAME;
NAME:
    ( LETTER | '#' | '_' ) ( LETTER | NUMBER | '#' | '_' | '.' )*
    ;
NUMBER: DIGIT+;

fragment LETTER: 'a'..'z' | 'A'..'Z';
fragment DIGIT: '0'..'9';
SPACE
    :
    ( ' ' | '\t' | '\n' | '\r' )+
    { skip(); }
    ;

JDK 1.6 提示code too large 并且无法编译。为什么以及如何解决这个问题?

最佳答案

实际上我不会说这是一个大语法,而且它不能生成合理大小的代码肯定有原因。

我认为问题与这条规则直接相关:

QUOTED: {textMode}?=> ~('\'')*;

为什么您希望将引用部分作为一个单独的标记,而不是将其与引用结合在一起,因为 Bart 也在他的语法中提到了这一点,这有什么特别的原因吗?这也会使 textMode 变量过时。

删除 QUOTE 并将 QUOTED 替换为

QUOTED: '\'' (~'\'')* '\'';

很可能会解决问题,即使不拆分语法也是如此。

关于java - 为什么我的 antlr lexer java 类是 "code too large"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6283980/

相关文章:

java - 如何阻止 ANTLR 抑制语法错误?

java - 为什么 ANTLR 没有按照我期望的方式识别这条规则?

绘制列表时发生 Java 错误

java - OOP 语言的函数式编程

java - 使用 ANTLR 语法进行 Verilog 解析

java - 如何在 ANTLR3 TreeParser 中获取行号

java - 如何获取通知 Intent 数据

java - 字符不会存储在列表中

parsing - 如何使用 ANTLR 正确解析泛型类型?

compiler-construction - ANTLR 3 的两级语法