标签: antlr

为什么Nhibernate不能为我创建这个简单的查询?

我无法理解为什么不创建这个简单的查询.我从一个测试中调用这个方法,并抛出一个异常抱怨第1行,第7列,我看不出有什么问题.

    public IList<Continent> GetContinentByName(string name)
      {
       ISession session = GetSession();

       IQuery query = 
                         session.CreateQuery("select from Continent where Continent.ContinentShort='Atlantis'");

// (........) Next step will be getting the list from the query if I can make it work
Run Code Online (Sandbox Code Playgroud)

我在下面得到了例外情况

TestCase'M:DataAccessLayer.HibernateDataProvider.GetContinentByName(System.String)'失败:抛出了类型'Antlr.Runtime.NoViableAltException'的异常.在第1行第7列附近NHibernate.Hql.Ast.ANTLR.QuerySyntaxException:抛出了类型'Antlr.Runtime.NoViableAltException'的异常.靠近第1行第7列

有什么建议?

谢谢

.net nhibernate antlr

1
推荐指数
1
解决办法
7079
查看次数

为什么会发生此错误? - "以下替代品永远无法匹配"

我对编译器,解析器和解析器生成器感兴趣,但我对它们知之甚少.

在阅读了这个问题的答案之后,我尝试制作一个"非常"简单的LaTeX解析器.

这是代码:

grammar Latex;

latex   :   ITEM*;
ITEM    :   CMD|LAWTEXT;
CMD :   CHEAD ARGS;
CHEAD   :   '\\' LETTER(LETTER|DIGIT)*;
LETTER  :   'A'..'Z'|'a'..'z';
DIGIT   :   '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9';
ARGS    :   '{' ITEM* '}';
LAWTEXT :   (LETTER|DIGIT|WHITESPACE|PUNC)*;
WHITESPACE
    :   ' '|'\t'|'\n'|'\r';
PUNC    :   '!'|'^';
Run Code Online (Sandbox Code Playgroud)

(PUNC中只有两个字符用于测试目的)

这是错误消息:

[18:39:09] warning(200): C:\Users\***\Documents\Latex.g:9:12: Decision can match input such as "{'\t'..'\n', '\r', ' '..'!', '0'..'9', 'A'..'Z', '\\', '^', 'a'..'z', '}'}" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
[18:39:09] error(201): …
Run Code Online (Sandbox Code Playgroud)

parsing antlr antlrworks

1
推荐指数
1
解决办法
1113
查看次数

以递归方式遍历树的第一个问题

我正在尝试使用ANTLR树命令和递归遍历树.我目前的代码是:

public void traverseTree(Tree tree){
        int counter = 0;
        System.out.println(tree.toString());
        if (tree.getChildCount() > 0 && tree.getChild(0) != null){
            System.out.println(tree.toString() + counter++);
            tree = tree.getChild(0);
            traverseTree(tree);

        }
        while (tree.getParent().getChild(tree.getChildIndex() + 1) != null){
            System.out.println(tree.toString() + counter++);
            tree = tree.getParent().getChild(tree.getChildIndex() + 1);
            traverseTree(tree);

        }
    }
Run Code Online (Sandbox Code Playgroud)

但是,它没有用.我在树中获得了很多条目,但没有明显的顺序.谁能看到我哪里出错了?

谢谢.

编辑:

我在下面做的评论应该是从这里开始的:

对不起,我应该删除打印语句,他们只是尝试调试它.我遇到的问题是它应该只搜索它开始的节点和该节点的任何兄弟节点,它不应该上升到一个级别,但确实如此,它会打印所有内容.(我将这个编辑成主要的,应该一直在那里开始,抱歉).

我设法最终使代码工作如下:

public void traverseTree(Tree tree){
        System.out.println(tree);
        if (tree.getChild(0) != null){
            traverseTree(tree.getChild(0));
        }
        if(tree.getParent().getChildCount() > 1){
            if(tree.getParent().getChild(tree.getChildIndex() + 1) != null)
            traverseTree(tree.getParent().getChild(tree.getChildIndex() + 1));
        }
    }
Run Code Online (Sandbox Code Playgroud)

java tree recursion antlr

1
推荐指数
1
解决办法
3万
查看次数

期待ANTLR中的NEWLINE

我有一个错误显示:

line 1:5 mismatched input '<EOF>' expecting NEWLINE
Run Code Online (Sandbox Code Playgroud)

我的意见:

print "hi"
Run Code Online (Sandbox Code Playgroud)

我基本上是ANTLR的新手,所以我真的不知道这个错误的含义是什么?我知道我应该有一个文件结束,但我应该如何放置它?

java antlr eof

1
推荐指数
1
解决办法
1744
查看次数

ANTLR 4:语法不好,'输入时没有可行的选择'

我正在使用ANTLR 4:

import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.TokenStream;

public class Builder
{
    public static void main(String[] args)
    {
        CharStream input = new ANTLRInputStream("ON M1==2 && M3 == 5 && (M2 > 1 || M5 <= 5.0) "
                                              + "DO P5:42 P4:10");
        ExprLexer lexer = new ExprLexer(input);
        TokenStream tokens = new CommonTokenStream(lexer);
        ExprParser parser = new ExprParser(tokens);
        ExprParser.ExpressionContext uu = parser.expression();
        for (int i = 0; i < uu.getChildCount(); ++i)
            System.out.println(uu.getChild(i));
    }
}
Run Code Online (Sandbox Code Playgroud)

以下语法:

grammar Expr;
options
{
  // …
Run Code Online (Sandbox Code Playgroud)

grammar parsing antlr token antlr4

1
推荐指数
1
解决办法
8547
查看次数

java.lang.ClassNotFoundException:antlr.ANTLRException

我有一个方法来获得表的第一个结果.

public T LoadFirstData()
{
    T object = null;
    try {
        startOperation();
        Query query = session.createQuery("from " + type.getName());
        object = (T) query.list().get(0);
    } 
    catch (HibernateException e) 
    {
        HandleException(e);
    } finally 
    {
        HibernateUtil.Close(session);
    }
    return object;
}
Run Code Online (Sandbox Code Playgroud)

但是,当我运行该方法时,我有例外

Exception in thread "main" java.lang.NoClassDefFoundError: antlr/ANTLRException
    at org.hibernate.hql.ast.ASTQueryTranslatorFactory.createQueryTranslator(ASTQueryTranslatorFactory.java:58)
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:98)
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
    at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:98)
    at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
    at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
    at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1760)
    at DataAccess.WKS.Repositories.WksRepositoryBase.LoadAllData(WksRepositoryBase.java:193)
    at Run.main(Run.java:13)
Caused by: java.lang.ClassNotFoundException: antlr.ANTLRException
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown …
Run Code Online (Sandbox Code Playgroud)

java antlr

1
推荐指数
1
解决办法
1万
查看次数

为什么在带有C语法的ANTLR 4中#include语句没有可行的替代方案?

我刚刚开始使用ANTLR v4而且我有点困惑......

我使用C语法文件从ANTLR项目在这里与C的下列位工作:

#include <stdio.h>

int main()
{
   printf("Hello");
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

(保存为C:\ Users\Public\tc).

我生成了C解析器,如下所示:

java -cp lib/antlr-4.4-complete.jar org.antlr.v4.Tool -o src/cparser src/C.g4
Run Code Online (Sandbox Code Playgroud)

我编辑了生成的文件,将包语句放在顶部.

然后,我启动了一个包含这些生成文件的Java项目,引用antlr-runtime-4.4.jar了一个主类,如下所示:

package antlrtest;

import java.io.IOException;

import org.antlr.v4.runtime.ANTLRFileStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.tree.ParseTreeWalker;

import cparser.CLexer;
import cparser.CParser;
import cparser.CParser.CompilationUnitContext;

public class AntlrTestMain {
    public static void main(String[] arguments) {
        try {           
            CParser parser = new CParser(
                new CommonTokenStream(
                        new CLexer(
                                new ANTLRFileStream("C:\\Users\\Public\\t.c"))));

            parser.setBuildParseTree(true);

            // This line prints the error
            CompilationUnitContext ctx = parser.compilationUnit();

            MyListener …
Run Code Online (Sandbox Code Playgroud)

java antlr antlr4

1
推荐指数
2
解决办法
1719
查看次数

允许空白部分ANTLR4

我有一个antlr4语法,专门用于嵌入到文本模板中的特定于域的语言.

有两种模式:

  • 文本(应保留空格)
  • 代码(应忽略空格)

示例语法部分:

template
  :  '{' templateBody '}'
  ;

templateBody
  : templateChunk*
  ;

templateChunk
  : code # codeChunk // dsl code, ignore whitespace
  | text # textChunk // any text, preserve whitespace
  ;
Run Code Online (Sandbox Code Playgroud)

规则code可以包含对template规则的嵌套引用.因此解析器必须支持嵌套空白/非空白部分.

也许lexer模式可以帮助 - 有一些缺点:

  • 必须在另一个编译器传递中解析代码段
  • 我怀疑嵌套部分是否可以正确映射

然而,最有希望的方法似乎是操纵隐藏的渠道.

我的问题:是否有最佳实践来满足这些要求?是否有一个示例语法,已经解决了类似的问题?

附录:

其余的语法可能如下所示:

code
  : '@' function
  ;

function
  : Identifier '(' argument ')'
  ;

argument
  : function
  | template
  ;

text
  : Whitespace+
  | Identifier
  | .+
  ; …
Run Code Online (Sandbox Code Playgroud)

java antlr antlr4

1
推荐指数
1
解决办法
2465
查看次数

修改Antlr生成的表达式?

我想用Antlr4读取表达式并对它们执行一些修改.

例如,如果语法是算术,我会修改表达式,表示

2 * (3 + 1)
Run Code Online (Sandbox Code Playgroud)

2 * 4
Run Code Online (Sandbox Code Playgroud)

然后用

8
Run Code Online (Sandbox Code Playgroud)

这是"计算"或"简化".要执行此操作,我将创建一些树结构,第一个想法是使用由Antlr创建的完全相同的树.

不幸的是,我没有看到儿童的任何二传手.

怎么做?我是否真的应该将Antlr树与我自己的树重复用于表达式逻辑?

java antlr antlr4

1
推荐指数
1
解决办法
546
查看次数

有多少种方法可以构建解析器?

我正在学习ANTLR v4,它是一个基于所谓的自适应LL(*)算法的解析器生成器.它声称是对LL(*)算法的重大改进.但我也听说过像LR这样的算法.

因此,出于好奇而得到一个大局:

  • 有多少现代算法可以构建解析器?
  • 什么是ANTLR自适应LL(*)算法的优势/局限?

compiler-construction parsing antlr ll-grammar lr-grammar

1
推荐指数
1
解决办法
479
查看次数