GVKun编程网logo

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

7

如果您想了解为什么我的antlrlexerJava类“代码太大”?和antlr.noviablealtexception的知识,那么本篇文章将是您的不二之选。我们将深入剖析为什么我的antlrlexe

如果您想了解为什么我的antlr lexer Java类“代码太大”?antlr.noviablealtexception的知识,那么本篇文章将是您的不二之选。我们将深入剖析为什么我的antlr lexer Java类“代码太大”?的各个方面,并为您解答antlr.noviablealtexception的疑在这篇文章中,我们将为您介绍为什么我的antlr lexer Java类“代码太大”?的相关知识,同时也会详细的解释antlr.noviablealtexception的运用方法,并给出实际的案例分析,希望能帮助到您!

本文目录一览:

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

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

这是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并且无法编译。为什么以及如何解决问题?

答案1

小编典典

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

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

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

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

删除QUOTE并将QUOTED替换为

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

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

ANTLR v4,JavaLexer和JavaParser将null作为解析树返回

ANTLR v4,JavaLexer和JavaParser将null作为解析树返回

我正在使用antlr v4来提取 java程序的解析树以用于其他目的.我从这个样本开始: ANTLR v4 visitor sample

我已经测试了给定链接上的步骤,以检查它是否有效以及一切正常:

java Run
a = 1+2
b = a^2
c = a+b*(a-1)
a+b+c
^Z
Result: 33.0

然后我编写了自己的解析java程序如下面的结构:

|_Java.g4                                                               
|_Java.tokens                                                           
|_JavaBaseVisitor.java                                                  
|_JavaLexer.java                                                        
|_JavaLexer.tokens                                                      
|_JavaParser.java                                                       
|_JavaTreeExtractorVisitor.java                                         
|_JavaVisitor.java           
|_Run.java

Run.java如下:

import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;

public class Run {
    public static void main(String[] args) throws Exception {
        CharStream input = CharStreams.fromFileName("F:\\Projects\\Java\\Netbeans\\ASTProj\\JavaTreeExtractor\\prog.java");
        JavaLexer lexer = new JavaLexer(input);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        JavaParser parser = new JavaParser(tokens);
        ParseTree tree = parser.getContext();

        JavaTreeExtractorVisitor calcVisitor = new JavaTreeExtractorVisitor();
        String result = calcVisitor.visit(tree);
        System.out.println("Result: " + result);
    }
}

但是在语句ParseTree tree = parser.getContext();树对象变为null.
因为我是antlr的新手,有什么建议让我检查或任何解决方案?

(如果需要更多信息,请通知我).

TG.

解决方法

假设您正在使用语法 here,那么您需要解析Java文件的起点
ParseTree tree = parser.compilationunit();

(对于没有使用该语法的任何人,您需要您命名为顶级解析器规则的任何内容.)

com.intellij.lang.java.lexer.JavaDocLexer的实例源码

com.intellij.lang.java.lexer.JavaDocLexer的实例源码

项目:consulo-java    文件:RecordUtil.java   
public static boolean isDeprecatedByDocComment(@NotNull LighteraST tree,@NotNull LighteraSTNode comment)
{
    String text = LightTreeUtil.toFilteredString(tree,comment,null);
    if(text.contains(DEPRECATED_TAG))
    {
        JavaDocLexer lexer = new JavaDocLexer(LanguageLevel.HIGHEST);
        lexer.start(text);
        IElementType token;
        while((token = lexer.getTokenType()) != null)
        {
            if(token == JavaDocTokenType.DOC_TAG_NAME && DEPRECATED_TAG.equals(lexer.getTokenText()))
            {
                return true;
            }
            lexer.advance();
        }
    }

    return false;
}
项目:consulo-java    文件:JavaHighlightingLexer.java   
public JavaHighlightingLexer(LanguageLevel languageLevel) {
  super(new JavaLexer(languageLevel));
  registerSelfStoppingLayer(new StringLiteralLexer('\"',JavaTokenType.STRING_LIteraL),new IElementType[]{JavaTokenType.STRING_LIteraL},IElementType.EMPTY_ARRAY);

  registerSelfStoppingLayer(new StringLiteralLexer('\'',new IElementType[]{JavaTokenType.CHaraCTER_LIteraL},IElementType.EMPTY_ARRAY);

  layeredLexer docLexer = new layeredLexer(new JavaDocLexer(languageLevel));

  HtmlHighlightingLexer lexer = new HtmlHighlightingLexer();
  lexer.setHasNoEmbeddments(true);
  docLexer.registerLayer(lexer,JavaDocTokenType.DOC_COMMENT_DATA);

  registerSelfStoppingLayer(docLexer,new IElementType[]{JavaDocElementType.DOC_COMMENT},IElementType.EMPTY_ARRAY);
}
项目:intellij-ce-playground    文件:JavaParserDeFinition.java   
@NotNull
public static Lexer createDocLexer(@NotNull LanguageLevel level) {
  return new JavaDocLexer(level);
}
项目:tools-idea    文件:JavaParserDeFinition.java   
@NotNull
public static Lexer createDocLexer(@NotNull LanguageLevel level) {
  return new JavaDocLexer(level);
}

com.intellij.lang.java.lexer.JavaLexer的实例源码

com.intellij.lang.java.lexer.JavaLexer的实例源码

项目:intellij-ce-playground    文件:PsiElementFactoryImpl.java   
@NotNull
@Override
public PsiKeyword createKeyword(@NotNull @NonNls String keyword,PsiElement context) throws IncorrectOperationException {
  if (!JavaLexer.isKeyword(keyword,PsiUtil.getLanguageLevel(context))) {
    throw new IncorrectOperationException("\"" + keyword + "\" is not a keyword.");
  }
  return new LightKeyword(myManager,keyword);
}
项目:intellij-ce-playground    文件:ResourceNameConverter.java   
@Override
public String fromString(@Nullable @NonNls String s,ConvertContext context) {
  if (s == null) {
    return null;
  }
  String fieldName = AndroidResourceUtil.getFieldNameByResourceName(s);
  return StringUtil.isJavaIdentifier(fieldName) && !JavaLexer.isKeyword(fieldName,LanguageLevel.JDK_1_5) ? s : null;
}
项目:tools-idea    文件:PsiElementFactoryImpl.java   
@NotNull
@Override
public PsiKeyword createKeyword(@NotNull @NonNls String keyword,keyword);
}
项目:intellij-ce-playground    文件:JavaParserDeFinition.java   
@NotNull
public static Lexer createLexer(@NotNull LanguageLevel level) {
  return new JavaLexer(level);
}
项目:intellij-ce-playground    文件:ClsParsingUtil.java   
public static boolean isJavaIdentifier(@NotNull String identifier,@NotNull LanguageLevel level) {
  return StringUtil.isJavaIdentifier(identifier) && !JavaLexer.isKeyword(identifier,level);
}
项目:intellij-ce-playground    文件:PsiNameHelperImpl.java   
@Override
public boolean isIdentifier(@Nullable String text,@NotNull LanguageLevel languageLevel) {
  return text != null && StringUtil.isJavaIdentifier(text) && !JavaLexer.isKeyword(text,languageLevel);
}
项目:intellij-ce-playground    文件:PsiNameHelperImpl.java   
@Override
public boolean isKeyword(@Nullable String text) {
  return text != null && JavaLexer.isKeyword(text,getLanguageLevel());
}
项目:intellij-ce-playground    文件:ResourceValue.java   
@Nullable
public String getErrorMessage() {
  // @null is a valid resource reference,even though it is not otherwise a valid
  // resource url (it's missing a resource type,"null" is a Java keyword,etc)
  if ("null".equals(myResourceName) && myResourceType == null && myPrefix == '@') {
    return null;
  }

  if (myResourceName == null || myResourceName.isEmpty()) {
    if (myResourceType == null && (myPrefix == '@' || myPrefix == '?')) {
      return "Missing resource type";
    }
    return "Missing resource name";
  }

  ResourceType type;
  if (myResourceType == null) {
    if (myPrefix != '?') {
      if (myPrefix == '@' && myResourceName.indexOf('/') == -1) {
        return "Missing /";
      }
      return "Missing resource type";
    }
    type = ResourceType.ATTR;
  } else if (PLUS_ID.equals(myResourceType)) {
    type = ResourceType.ID;
  } else {
    type = ResourceType.getEnum(myResourceType);
    if (type == null) {
      return "UnkNown resource type " + myResourceType;
    }
  }

  String name = myResourceName;
  if (FolderTypeRelationship.getRelatedFolders(type).contains(ResourceFolderType.VALUES)) {
    name = AndroidResourceUtil.getFieldNameByResourceName(name);
  }

  if (!AndroidUtils.isIdentifier(name)) {
    if (JavaLexer.isKeyword(name,LanguageLevel.JDK_1_5)) {
      return "Resource name cannot be a Java keyword (" + name + ")";
    }

    if (!Character.isJavaIdentifierStart(name.charat(0))) {
      return "The resource name must begin with a character";
    }
    for (int i = 1,n = name.length(); i < n; i++) {
      char c = name.charat(i);
      if (!Character.isJavaIdentifierPart(c)) {
        return String.format("'%1$c' is not a valid resource name character",c);
      }
    }

    return "Resource name '" + name + "' must be a valid Java identifier";
  }

  return null;
}
项目:intellij-ce-playground    文件:AndroidUtils.java   
public static boolean isIdentifier(@NotNull String candidate) {
  return StringUtil.isJavaIdentifier(candidate) && !JavaLexer.isKeyword(candidate,LanguageLevel.JDK_1_5);
}
项目:tools-idea    文件:JavaParserDeFinition.java   
@NotNull
public static Lexer createLexer(@NotNull LanguageLevel level) {
  return new JavaLexer(level);
}
项目:tools-idea    文件:ClsParsingUtil.java   
public static boolean isJavaIdentifier(@NotNull String identifier,level);
}
项目:tools-idea    文件:PsiNameHelperImpl.java   
@Override
public boolean isIdentifier(@Nullable String text,languageLevel);
}
项目:tools-idea    文件:PsiNameHelperImpl.java   
@Override
public boolean isKeyword(@Nullable String text) {
  return text != null && JavaLexer.isKeyword(text,getLanguageLevel());
}
项目:embeddedlinux-jvmdebugger-intellij    文件:EmbeddedJavaModuleStep.java   
/**
 * Proper Identifier
 *
 * @param candidate
 * @return
 */
public static boolean isIdentifier(@NotNull String candidate) {
    return StringUtil.isJavaIdentifier(candidate) && !JavaLexer.isKeyword(candidate,LanguageLevel.JDK_1_6);
}

Java Scanner为什么我的代码中的nextLine()被跳过?

Java Scanner为什么我的代码中的nextLine()被跳过?

Scanner kb = new Scanner(System.in);
System.out.println(“Inserting L”);
int L = kb.nextInt();
System.out.println(“Inserting N”);
int N = kb.nextInt();
System.out.println(“Inserting x”);
String x = kb.nextLine();
System.out.println(x);
System.out.println(“You inputed L,N,x”);

为什么nextLine()在此代码中没有提示?

我们今天的关于为什么我的antlr lexer Java类“代码太大”?antlr.noviablealtexception的分享已经告一段落,感谢您的关注,如果您想了解更多关于ANTLR v4,JavaLexer和JavaParser将null作为解析树返回、com.intellij.lang.java.lexer.JavaDocLexer的实例源码、com.intellij.lang.java.lexer.JavaLexer的实例源码、Java Scanner为什么我的代码中的nextLine()被跳过?的相关信息,请在本站查询。

本文标签: