当前位置: 首页 > 面试题库 >

为什么我的antlr lexer Java类“代码太大”?

狄兴业
2023-03-14
问题内容

这是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}?=> ~('\'')*;

您是否有任何特定的原因想要将QUOTED部分作为单独的标记,而不是像Bart一样将其与引号结合使用呢?这也会使textMode变量过时。

删除QUOTE并将QUOTED替换为

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

即使不拆分语法,最有可能解决该问题。



 类似资料:
  • 这似乎与对象没有被实例化有关,尽管我不太明白为什么。有人知道出什么事了吗?

  • 包装呈现值;导入java。util。扫描仪; 公共类PresentValue{ }问题是写一个方法presentValue来执行此计算。该方法应接受未来值、年利率和年数作为参数。它应该返回现值,即您今天需要存入的金额。在一个程序中演示该方法,该程序允许用户试验公式项的不同值。 这里是公式P=F/(1r)^2

  • 我试图解决Dijkstra算法上的一个hackerrank问题--https://www.hackerrank.com/challenges/dijkstrashortreach。我在使用我自己的Dijkstra代码逻辑。虽然我的代码解决了更容易的测试用例,但它在更高的测试用例上失败了。我猜我的代码在某个地方缺少了一些传递性,并且我得到的某个节点的值高于预期。你能帮我找出我的错误吗?问题:输入格式

  • 我正在做一个编码练习:给定一个整数序列作为一个数组,确定是否可以通过从数组中删除不超过一个元素来获得严格递增的序列。 所以我写了这段代码: 现在,这段代码似乎适用于大多数序列,但这段代码引发了一个错误: 错误如下: 我只是不明白列表索引怎么可能超出范围…有人有线索吗?

  • 我试图使java编译类文件,但它抛出了一个错误,如何修复它。

  • 今天我在家里的电脑上安装了netbean,以便在家做一些工作。我安装了java 8 JDK(151),并安装了包含所有内容的netbean(没有进行自定义安装)。然后我把我的项目从github上撤下来。 我的安装文件夹是在E:\netbean我的项目文件夹是默认的c: 我加载了项目,打开XAMPP并运行它。太好了,很管用。 然后我对HTML进行了更改(修复了我犯的一个拼写错误)。再次运行。找不到零