我无法理解为什么不创建这个简单的查询.我从一个测试中调用这个方法,并抛出一个异常抱怨第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列
有什么建议?
谢谢
我对编译器,解析器和解析器生成器感兴趣,但我对它们知之甚少.
在阅读了这个问题的答案之后,我尝试制作一个"非常"简单的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) 我正在尝试使用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) 我有一个错误显示:
line 1:5 mismatched input '<EOF>' expecting NEWLINE
Run Code Online (Sandbox Code Playgroud)
我的意见:
print "hi"
Run Code Online (Sandbox Code Playgroud)
我基本上是ANTLR的新手,所以我真的不知道这个错误的含义是什么?我知道我应该有一个文件结束,但我应该如何放置它?
我正在使用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) 我有一个方法来获得表的第一个结果.
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) 我刚刚开始使用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) 我有一个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) 我想用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树与我自己的树重复用于表达式逻辑?
我正在学习ANTLR v4,它是一个基于所谓的自适应LL(*)算法的解析器生成器.它声称是对LL(*)算法的重大改进.但我也听说过像LR这样的算法.
因此,出于好奇而得到一个大局:
antlr ×10
java ×6
antlr4 ×4
parsing ×3
.net ×1
antlrworks ×1
eof ×1
grammar ×1
ll-grammar ×1
lr-grammar ×1
nhibernate ×1
recursion ×1
token ×1
tree ×1