如果您想了解为什么我的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 v4,JavaLexer和JavaParser将null作为解析树返回
- com.intellij.lang.java.lexer.JavaDocLexer的实例源码
- com.intellij.lang.java.lexer.JavaLexer的实例源码
- Java Scanner为什么我的代码中的nextLine()被跳过?
为什么我的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作为解析树返回
我已经测试了给定链接上的步骤,以检查它是否有效以及一切正常:
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.
解决方法
ParseTree tree = parser.compilationunit();
(对于没有使用该语法的任何人,您需要您命名为顶级解析器规则的任何内容.)
com.intellij.lang.java.lexer.JavaDocLexer的实例源码
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; }
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); }
@NotNull public static Lexer createDocLexer(@NotNull LanguageLevel level) { return new JavaDocLexer(level); }
@NotNull public static Lexer createDocLexer(@NotNull LanguageLevel level) { return new JavaDocLexer(level); }
com.intellij.lang.java.lexer.JavaLexer的实例源码
@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); }
@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; }
@NotNull @Override public PsiKeyword createKeyword(@NotNull @NonNls String keyword,keyword); }
@NotNull public static Lexer createLexer(@NotNull LanguageLevel level) { return new JavaLexer(level); }
public static boolean isJavaIdentifier(@NotNull String identifier,@NotNull LanguageLevel level) { return StringUtil.isJavaIdentifier(identifier) && !JavaLexer.isKeyword(identifier,level); }
@Override public boolean isIdentifier(@Nullable String text,@NotNull LanguageLevel languageLevel) { return text != null && StringUtil.isJavaIdentifier(text) && !JavaLexer.isKeyword(text,languageLevel); }
@Override public boolean isKeyword(@Nullable String text) { return text != null && JavaLexer.isKeyword(text,getLanguageLevel()); }
@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; }
public static boolean isIdentifier(@NotNull String candidate) { return StringUtil.isJavaIdentifier(candidate) && !JavaLexer.isKeyword(candidate,LanguageLevel.JDK_1_5); }
@NotNull public static Lexer createLexer(@NotNull LanguageLevel level) { return new JavaLexer(level); }
public static boolean isJavaIdentifier(@NotNull String identifier,level); }
@Override public boolean isIdentifier(@Nullable String text,languageLevel); }
@Override public boolean isKeyword(@Nullable String text) { return text != null && JavaLexer.isKeyword(text,getLanguageLevel()); }
/** * 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()被跳过?
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()被跳过?的相关信息,请在本站查询。
本文标签: