我正在尝试分析Name=Value对的列表,其中的值可以包含除空格以外的任何内容(即值可以包含等号)。
名称仅限于常用的标识符字符
问题是,“Value”标记匹配所有内容。例如,对于输入:
dude=sweet
解析器将用一个“值”标记匹配整个输入(并抛出一个不匹配的TokenException)
在bison中,有可能将状态分配给令牌(或者这只是针对非终端?),这样它们只有在显式转换到该状态后才“有资格”匹配
想想看,这在bison中也不起作用-令牌拆分已经发生(在flex中);然而,我认为
标签: Antlr
named-parameters
我一直在寻找一种在ANTLR中以任意顺序显示命名函数参数的方法。有人知道ANTLR解析器表达式中是否存在忽略顺序的语法吗
假设语言中有一个函数foo,它可以接受两个命名参数:x和y。由于它们是命名参数,我希望它们能够以任意顺序传递到函数中:
foo(x=1, y=2)
以及
foo(y=2, x=1)
两者都应该是合法的
我可以列出ANTLR中的所有参数排列,但我希望会有一个更优雅的解决方案,特别是因为我有一些可以接受5个参数的函数
任何帮助都将不胜感激 我很确定ANTLR没有内置任何东西来
我的语言包含一些在构建时未知但在运行时已知的单词,因此需要不断地重新构建/重新部署程序以考虑新单词。我想知道在Antlr中是否可以从配置文件生成一些令牌
e、 在一个简化的例子中,如果我有一个规则
rule : WORDS+;
WORDS : 'abc';
我的语言在运行时遇到了“bcd”,我希望能够修改配置文件,将bcd定义为单词,而不必重新构建然后重新部署 您可以向lexer类添加某种集合。此集合将保存所有运行时单词。然后,在规则中添加一些可能与这些运行时单词匹配的自定义代码,并更改令牌
片段在ANTLR中是什么意思
这两条规则我都见过:
fragment DIGIT : '0'..'9';
及
区别是什么?片段在某种程度上类似于内联函数:它使语法更可读,更易于维护
片段永远不会被算作标记,它只用于简化语法
考虑:
NUMBER: DIGITS | OCTAL_DIGITS | HEX_DIGITS;
fragment DIGITS: '1'..'9' '0'..'9'*;
fragment OCTAL_DIGITS: '0' '0'..'7'+;
fragment HEX_D
我有以下ANTLR语法,Terrence Parr给出了一个例子
grammar b;
backtrack
: (cast ';')=> cast ';'
| (e ';')=> e ';'
| e '.'
;
cast: '(' ID ')' ;
e : '(' e ')'
| ID
;
ID : 'a'..'z'+ ;
然而,当我试图用回溯规则解释(a)时,我得到了一个不匹
我正在尝试将为未知工具开发的现有语法移植到Antlr。
语法中有一个用例,其中有两个标记,例如TEXT和TEXT_,但没有_a
语法中的一些规则应该只允许不带a的文本,但其他规则可以使用文本
我最初的尝试产生了以下语法,但问题是,当txt实际上是它的超集时,Antlr匹配更具体的语法规则(txtwa)。如果我输入类似“sometextwth”的不包含a的内容,Antlr不遵循text(txt)的规则预期输入为txt,提供的输入匹配为,但Antlr发现输入匹配txtwa,即使在语法上不预期,也选择
我正在使用Antlr2.7.4创建一个lexer。我被以下情况困住了:
如果冒号(“:”)后面跟有来自类C1的字符,则冒号标记应该在后面跟有标记C1
如果冒号后跟字符类C2中的字符,则冒号应作为C2的一部分,并应发出标记C2
假设类C1是{1,2,3},类C2是{A,B,C},那么:13应该标记为冒号,后跟C1。但是:AB应该标记为C2
更具体地说,我有一种语言的语法,它有两种结构:
标识符:Type//它有三个标记:IDENT冒号IDENT。类调用类型注释
://这是一个标识符。有一类字
标签: Antlr
antlr3abstract-syntax-tree
我正在开发一个将Oracle SQL转换为ANSI SQL的工具。我有一个可以同时解析Oracle SQL和ANSI SQL的语法
我想从AST的where子句部分提取Oracle外部联接表达式,并在AST的from子句部分的末尾为匹配的select或子查询插入新的联接子句
具有重写规则的树解析器可以进行这种类型的树转换吗
i、 e.获取从Oracle SQL生成的AST
SELECT
a.columna, b.columnb
FROM
tablea a,
tableb b
WHER
如何编写语法或词法规则来描述ANTLR中的JSP/EL标识符或字符串文字?请记住,JSP/EL是Unicode,不能在规则中列出所有可能的符号。还要记住,字符串可能包含EL表达式,这可能很复杂,因此lexer不足以描述它们,需要解析器,而ANTLR解析器无法匹配字符类或任何字符。检查新的“词法模式”:
词汇模式
模式允许您按上下文对词汇规则进行分组,例如XML标记的内部和外部。这就像有多个次级执行器,一个用于上下文。lexer只能通过在当前模式下输入规则来返回匹配的令牌。lexer以所谓的默认模
在哪里讨论了为ANTLR创建新语言目标的过程?虽然由于可用目标的数量,这似乎是ANTLR3的一些常识,但我没有看到任何捆绑在源代码中的文档,也没有在Google中找到任何明显的位置
我希望找不到任何关于ANTLR4的此类文档,但我根本看不到任何文档。在撰写本文时,还没有关于如何创建新的ANTLR目标的指南。ANTLR4的联合作者、该书的作者山姆·哈威尔已经开始了,但还并没有完成
有兴趣编写新目标的人可以看看C#是如何实现的(当然还有原始Java目标)。但要意识到这绝不是一件小事 ANTLR 3和
我使用antlrv4编写了一个t-sql解析器。
这个警告有问题吗
“规则'sqlCommit'包含一个可选块,其中至少有一个可选块可以匹配空字符串”
我的代码:
sqlCommit: COMMIT (TRAN | TRANSACTION | WORK)? id?;
id:
ID | CREATE | PROC | AS | EXEC | OUTPUT| INTTYPE |VARCHARTYPE |NUMERICTYPE |CHARTYPE |DECIMALTYPE | DOUBLETYPE
我是ANTLR(任何版本)的新手,我刚刚开始编写我的第一个语法文件。我将IntelliJ IDE与ANTLR插件(v1.6)一起使用
我的语法是
grammar TestGrammar;
testfile : message+ EOF;
message : timestamp WS id (NL | EOF);
timestamp : NumericLiteral;
id :
我刚刚开始学习编译器设计。我有一个小任务要写QBasic语法。但是在ANTLR上只有很少的目标语言。在QBasic上可以吗?请任何人对此进行解释。我所知道的最大的ANTLR语法库位于。而且QBasic看起来并不在其中
我写过一两个语法/解释器,语法与BASIC类似,具有特定于域的扩展名(没有行号!),但看起来没有人在ANTLR4中使用QBasic,至少没有公开使用过
我在使用SQL表达式解析器时遇到困难。具体来说,使用a和b以及a在c和d之间规则。备选方案规定如下:
| lhs=exprRule K_AND rhs=exprRule # AndExpression
| value=exprRule K_NOT? K_BETWEEN lower=exprRule K_AND upper=exprRule # BetweenExpression
不幸的是,此语法解析字符串,例如
...
l_discount BETWEEN 0.02 - 0.01 AND
下面是一种向规则上下文对象显式添加字段的方法
我的用例是一系列点和标识符:
dotIdentifierSequence
: identifier dotIdentifierSequenceContinuation*
;
dotIdentifierSequenceContinuation
: DOT identifier
;
通常我们需要处理dotIdentifierSequence结构的“完整路径”。Atm这意味着使用DotIdentifierSequence
我无法使用ANTLR正确识别“文件结尾”。只要在我得到的最后一个字符后没有新行,只有“文件结束”
第37行:1在“”处缺少换行符
关于如何正确处理文件结尾有什么想法吗
这是我的语法(用于GCode):
这是测试文件:
%
(Header)
(Generated by gcodetools from Inkscape.)
(Using default header. To add your own header create file "header" in the outpu
我对这种语法的行为感到困惑(在ANTLR 4.8中):
这是对书中一个例子的最小修改;我所做的只是在expr的第一个备选方案中添加一个?,这样*既可以是后缀一元运算符,也可以是二进制运算符
令我惊讶的是,这似乎打破了二进制运算符优先级的逻辑:
expr: expr '*' expr #MulExpr
| expr '+' expr #Addxpr
| expr '*' #PointerExpr
| '(' expr ')' #NestedExp
再见
如何构造一个简单的ANTLR语法来处理多行表达式,而不需要分号或反斜杠
我正在尝试为表达式编写一个简单的DSL:
# sh style comments
ThisValue = 1
ThatValue = ThisValue * 2
ThisOtherValue = (1 + 2 + ThisValue * ThatValue)
YetAnotherValue = MAX(ThisOtherValue, ThatValue)
总的来说,我希望我的应用程序为脚本提供一些初始命名值,并提取最
在上述场景中,“或”可以通过
表达式->二进制操作
或
EXPRESSION->UNARYOP->EXPRESSION->BINARYOP
有没有一种系统的方法来消除上述歧义?我认为消除语法中的歧义是一项无法自动解决的任务,因为如果选择哪一个选项是正确的,那就是一种“主观”选择
确定问题后,构建不同的替代树并添加新的生成规则以禁止无效的解析树
恐怕没有像删除左递归这样神奇的解决方案。。。也许我错了
在您的情况下,您可以定义
VARIABLE: ...
UNARYOP: 'not' Expres
标签: Antlr
antlr3ambiguity
几天来,我一直在尝试解析一些由文本和数字组成的文本(我在语法中称之为句子)
我有一个规则,需要解析以INT结尾的句子
sentence_with_int
: sentence INT;
所以,如果我有一些输入是“购买的14码鞋的数量是3”,那么句子_和_int将是匹配的,而不仅仅是句子。我相信有更好的方法可以做到这一点,但我只是在学习这个工具
谢谢你,Richard你的语法:
确实如此。这里有一个小测试线束:
import org.antlr.runtime.*;
我有一个ANTLR语法,不明白它是如何递归的。有没有办法让ANTLR显示它用来查看我的规则是递归的派生
整个递归语法:
grammar DeadMG;
options {
language = C;
}
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
INT : '0'..'9'+
;
FLOAT
: ('0'..'9')+ '.' ('0'..'9')* EX
标签: Antlr
grammarantlr3context-free-grammar
我尝试了以下方式报告错误
@members{
public String getErrorMessage(RecognitionException e,String[] tokenNames)
{
List stack=getRuleInvocationStack(e,this.getClass().getName());
String msg=null;
if(e instanceof NoViableAltException){
我想用antlr(目标C语言)编写一个程序,并将库(C运行时发行版)发送到包中,这样它就可以在其他机器上使用,而无需在该机器上安装antlr。我已在此链接上下载了此运行时的最新版本。谁能告诉我我能不能做到?干杯。我没有使用C目标,但使用了C目标。我想他们的工作方式也差不多
您需要将C运行时库与程序一起部署,因为生成的解析器和lexer将使用该库中的函数
您不需要安装Antlr本身,例如AntlrWorks或任何.jar文件是的,您可以静态链接它,但如何安装取决于您的平台。对于带有gcc或llvm
我希望以编程的方式将语法转换为字符串形式,并为其生成一个或多个字符串形式的Java。我想在内存中完成这一切,不涉及任何文件。我查看了org.antlr.Tool源代码,但我希望有更简单的方法来做我想要的事情,而不是重写没有文件的工具。有什么东西已经存在了吗
有什么东西已经存在了吗
不,一点也不。不在ANTLR的公共API中,也不在一些现有的第三方工具中
我正在尝试使用ANTLR将LALR语法转换为LL,但遇到了一些问题。到目前为止,我认为将表达式转换为自上而下的方法对我来说是很简单的。问题是当我将范围(1..10)和(1.0..10.0)包含在浮动中时
我试着使用这里找到的答案,但不知何故,我的代码甚至不能正确运行,更不用说解决一系列的浮点,即(float..float)。
附件是我的语法样本,只关注这个问题
grammar Test;
options {
language = Java;
output = AST;
}
pars
我有一个简单的lexer/语法,我一直在研究,我很难理解匹配格式化变量的标准操作过程。我正在尝试匹配以下内容:
变量名至少可包含1个字符。如果是一个字符,则必须是大写或小写字母
如果大于1个字符,则必须以任意大小写的字母开头,然后后跟任意数量的字符,包括数字、下划线和美元符号
我已经用多种方式重写了几次,但总是出现以下错误:
决策可以使用多个选项匹配输入,例如“单字母”:1、2
因此,该输入禁用了备选方案2“
我理解我的语法有一些歧义,但我有点困惑,为什么一旦我们进入最初的匹配循环,就可以匹配多
我正在编写一种类似SQL的语言。假设正确的语法是
USE foo;
SELECT * FROM bar;
但是我把它打到
US foo;
SELECT * FROM bar;
默认行为是Antlr将停止解析,并且我丢失了语法高亮显示和大纲视图。
错误消息是“US”处缺少EOF。我将IParser重新绑定到RuntimeModule中的自定义解析器
@Override
public Class<? extends org.eclipse.xtext.parser.IParser>
编辑:我更改了示例,以便更好地解释我想要得到的东西。
这是我的语法:
INTEGER : ' int ';
LET : [a-z] ;
cchar : LET | '-' | ' ' ;
wor : cchar+;
aaa : wor+ | wor* INTEGER wor* ;
aaa是根。并写下“xx int xx int”。
我想得到一个结果:“x x int x x I n t”。只应捕获第一个int,下一个int不应给出“无关输入”错误,而应拆分为字母
如何修复它?这似乎可以按
在ANTLR 3中,您可以执行以下操作:
andExpression
: (andnotExpression -> andnotExpression)
(AND? a=andnotExpression -> ^(AndNode $andExpression $a))*
;
你知道如何在新版本中实现吗?ANTLR 4没有像ANTLR 3那样的重写操作符或output=AST选项。ANTLR 4解析器生成的树是解析树,其形状由语法规则隐式定义
我有规则:
expression
: //...
| expression (relative_operator expression)+
| //...
;
理想情况下,当我输入1=1=1时,它将生成表达式(1,=,1,=,1)树。然而,实际上它会生成表达式(1,=,表达式(1,=,1))。这是因为它更喜欢递归解析,而不是一行解析。是否可以明确地告诉规则它不能在自身上递归,或者在尝试在自身上递归之前,它应该遵循+/*
可以显式地告诉规则它不能在自身上递归,或者在尝试在
我递归地遍历antlr解析树,我想编辑树中TerminalNodes的文本。我希望能够为任何ParseTree做到这一点,并且我不希望为可能遇到的每个ParseTree编写特定的访问者
我查看了权威的ANTLR4参考,发现antlr对树重写没有任何直接支持。我正在寻找任何可能的解决办法或替代方案
private void editTree(ParseTree tree){
for(int i = 0; i < tree.getChildCount();i++){
我有下面的一段语法
prod:(ID在中)?子规则(逗号(ID中)?子规则)*
ID、IN和COMMA是标记终端,prod规则生成一个子规则表达式列表
我用C++运行时使用访问者模式,现在我遇到了以下问题。
如何找出ID令牌属于哪个子规则?调用ID()方法允许我请求特定的第k个ID令牌,但它不必对应于第k个子规则。我想澄清这一点。下面是一个令牌流示例
subrule COMMA subrule COMMA
ID IN subrule COMMA
如果我在子规则向量上迭代,没有对应的并行ID迭
我的语法如下:
grammar Expr;
expr : '-' expr # unaryOpExpr
| expr ('*'|'/'|'%') expr # mulDivModuloExpr
| expr ('+'|'-') expr # addSubExpr
| '(' expr ')
我一直在用ANTLR(C#)构建一个类似google的查询语法解析器
我已经完成了,除了一件事,我已经挣扎了很长时间,但没有解决
如果用户输入“word1 word2 word3”,我希望解析器将其视为“word1、word2和word3”。因此实际上,“and”在术语之间是可选的/隐含的
我需要“and”来形成AST子树的根,如果“and”实际上不存在,那么这就不太好。即使使用了lookahead/backtrack,我也找不到正确的语法来实现它
下面是我当前语法的一个片段,它使用显式的“an
我使用ANTLR指定一种文件格式,其中包含的行不能超过254个字符(不包括行尾)。如何在语法中对其进行编码,除了:
line : CHAR? CHAR? CHAR? CHAR? ... (254 times)
这可以通过使用
首先,写语法的时候不要管你的行有多长。示例如下所示:
grammar Test;
parse
: line* EOF
;
line
: Char+ (LineBreak | EOF)
| LineBreak // empty line!
;
我想把一个语法从bison翻译成ANTLR。bison的语法本身非常简单,但我找不到一个简单的方法来实现这一点
野牛的语法:
expr = expr or expr | expr and expr | (expr)
欢迎提供任何提示/链接/指针
谢谢,
Iulian在ANTLR中,不能创建左递归规则:
a : a b
;
尾部递归很好:
a : b a
;
有关左递归规则的详细信息,请参阅
因此,您的示例可以如下所示:
parse
: expr+ EOF
;
expr
我看过python运行时模块,但不确定是否要创建python解析器和lexer文件。我已经编写了.g文件。以下是步骤:
写语法
运行ANTLR生成lexer/parser类
编译并运行Python源文件,了解如何操作
要完成任何有用的工作,您必须将代码放入AST中,然后遍历树。是你干的吗?你得到了什么
这是一个例子。它包括Python3。语法比较如何?感谢您的回答,我刚刚意识到您必须使用java=”生成语法分析器。=“我非常感谢您投票并接受答案,而不是您的感谢。@duffymo是否可以在代码中生
是否有一个选项可以生成更可读的antlr解析器。比如说,要禁用Token->DFA优化?您是否试图构建解析器的框架,以便将来手动维护它?从一开始就手工编写代码会是一个更好的选择吗?一个动机是可调试性,另一个动机是简单性:而不是让此代码匹配第一次出现的'once'//Exp.g:66:2:('once'条件('then')?操作)int alt13=4;alt13=dfa13.预测(输入);switch(alt13){case 1://Exp.g:66:4:'once'条件('then')?操作{
我想用ANTLR替换令牌
我尝试了使用TokenStream和replace,但没有成功
有什么建议吗
ANTLRStringStream in = new ANTLRStringStream(source);
MyLexer lexer = new MyLexer(in);
TokenRewriteStream tokens = new TokenRewriteStream(lexer);
for(Object obj : tokens.getTokens()) {
我想问“是”这个词是不是一个保留字。这就是我为什么这么问。我试图为其创建解析器的语言是优先级语言。我有一个任务,看起来像这样:
%VARIABLE IS STRING
使用Antlr解释器,我输入上面的语句,得到一个错误,指出
“失配异常”
如果我键入:
%VARIABLE AND STRING
一切正常
我花了一些时间四处寻找解决方案,但到目前为止什么都没有
这是我语法的一部分:
assignis : '%' IDENT logical_operator types ;
标签: Antlr
antlr3antlrv3ide
我正试图在Windows7平台上用antlrIDE构建一个解析器(用C语言)。我完成了语法(.g of combined grammar),它会自动为我生成lexer和parser。但是,我不知道如何编译.c和.h文件。我尝试了,但得到了错误,因为头包含(antlrIDE在解析器的点c文件中自动生成头#include“antlr.h”)。我读过这篇文章
但这对我没有帮助,你们能告诉我怎么做吗?感谢您的高级支持。您需要将ANTLR运行时添加到您的项目/解决方案中。以下是下载运行库的链接(来自您在问
标签: Antlr
dslxtextdsl-tools
我在XText中定义了我的DSL,它自动生成了Java版本的语言解析器和代码生成框架,这非常酷
问题是,我的DSL计划由使用多种语言实现的项目使用。您可以想象,我们可能至少需要在C#、Java和Ruby中解析DSL
所以问题是:有没有一种方法可以在xtext的帮助下为多种语言生成解析器 纯解析的东西只是整个Xtext套件的一小部分。集成到EclipseIDE和Xtend生成器中是两大块代码。Xtext构建在EMF-Ecore模型之上。这些部件都没有其他语言版本
因此,在普通C#和Ruby中运行X
下面是ANTLR语法的一个片段,它运行良好
它旨在成为一个tex解析器
如果我通过取消注释|text来修改规则的所有位置,则ANTLR会在规则escSeq
我觉得这很有趣。
我找不到左递归:要么我是瞎子,要么我误解了什么是左递归
有什么建议吗
afterNewline : (everywhere | par );
par : EoL {System.out.println("<PAR>");} afterNewline ;
everywhere : (Esc escSeq //|
我使用以下ANTLR语法来定义函数
definition_function
: DEFINE FUNCTION function_name '[' language_name ']'
RETURN attribute_type '{' function_body '}'
;
function_name
: id
;
language_name
: id
;
function_body
: SCRIPT
;
SCR
我正在为COBOL语言编写语法,我制定了一个规则来识别COBOL中的单词。
我的标识符规则是
IDENTIFIER : [a-zA-Z0-9]+ ([-_]+ [a-zA-Z0-9]+)*;
它在大多数情况下都可以正常工作,但是当我测试以下输入时
0000主程序
那么它就不起作用了。
请分享你宝贵的想法,让我变得正确。我怎样才能解决这个问题 根据,如果连字符是第一个或最后一个,则应将其视为字符而不是范围运算符。这可能不适用于ANTLR4类似正则表达式的lexer令牌定义
另外,您提出的COBO
给定以下ANTLR v3语法:
tokens
{
OPTION;
UNKNOWN;
}
statement : my_statement
| UNKNOWN_KEYWORD -> ^(UNKNOWN)
;
my_statement : FIRST SECOND type = THIRD? -> ^(OPTION $type?);
FIRST : 'my';
SECOND : 'keyword';
THIRD: 'best
在同一语法中解析有效日期和数字的最简单(最短、最少规则和无警告)方法是什么?我的问题是,匹配有效月份(1-12)的lexer规则将匹配1-12的任何事件。因此,如果我只想匹配一个数字,我需要一个解析规则,如:
number: (MONTH|INT);
当我为日和年添加lexer规则时,它只会变得更复杂。我想要一个日期解析规则,如下所示:
date: month '/' day ( '/' year )? -> ^('DATE' year month day);
date: month=
我知道我可以通过多种方式(侦听器或访问者)重写(解析器)规则的文本
但是,我想处理一些特定词汇匹配的文本(Lexer规则)
假设我们使用java语法。我们有一个完整的关键字列表:
ABSTRACT : 'abstract';
ASSERT : 'assert';
BOOLEAN : 'boolean';
BREAK : 'break';
// 50 more or so...
这是一个采样输入:
public \t\t\t\t class Y
我想知道如何修复此错误
以下规则集是相互左递归的[类型,数组类型]
目标是实现以下目标:
(数组类型)类型->类型[expr]
应包含在类型参数中的。任何帮助都将不胜感激
以下代码:
// Types
type
: atomic_type
| named_type
| pointer_type
| record_type
| enclosed_type
| array_type
;
atomic_type
: VOID
| CHAR
| INTEGER
我不熟悉ANTLR并使用ANTLR4(4.7.2 Jar文件)。我目前正在研究Oracle解析器
有没有办法从解析器或词法分析器直接向AST添加节点(带有一些文本)?
我将注释隐藏在我的Lexer中,并希望将其直接添加到树中
可能吗?我相信Less4j允许类似的事情
有没有办法从解析器或词法分析器直接向AST添加节点(带有一些文本)
不是来自lexer:在那个阶段还没有解析树
从解析器中,您可以这样做,但是没有ANTLR API可以这样做。ANTLR为您提供解析树,就像它解析您的输入一样。它不允
1 2 3 4 5 6 ...
下一页 最后一页 共 19 页