我知道ANTLR4的工作方式是对语法进行一些转换,从而消除歧义、左因子分解等,这样你就可以专注于编写更多可读的语法,而不是手工进行转换,这样机器就会接受它。在ANTLR做出这些更改后,有没有办法导出我的语法?我想看看我的语法有什么变化。ANTLR 4的参考版本没有执行任何左因子分解。ANTLR 4的优化版本在某些情况下确实执行左因子分解,但本版本中更高级的优化所产生的中间形式,左因子分解和间接左递归消除在标准ANTLR语法中是不可表达的。如果语法与标准不匹配,那就好了。我只是想看看它在我的解析器
我希望能够以编程方式定义lexer应该切换到哪种模式。假设我有一个语法可以解析php代码之类的东西
foo bar <?php ... ?>
要切换到cpp模式,对于名为something.java-tmpl的文件中的相同构造,请切换到java模式
我可以吗?如果可以,我怎么做?简短的回答是可以的。查看org.antlr.v4.runtime.Lexer.java,了解以编程方式管理Lexer模式的完整方法。这些是Antlr lexer语法中隐含的模式控制语句
foo bar
我尝试使用Python3目标来遵循,但是我被计算器示例卡住了。上面写着
AntLR的Python实现尽可能接近Java实现,因此您应该不会发现为Python改编示例有困难
但我还不明白
java代码访问者有一个.visit方法,在python中我没有这个方法。我认为这是因为在java中,visit方法具有令牌的参数重载。在python中,我们有visitProg(),visitAssign(),visitId()等等,但现在我无法编写value=self.visit(ctx.expr()),因为
错误是:
mismatched input 'elseState' expecting RULE_TOKEN_REF
有人能给我解释一下为什么我会有这个错误以及如何修复它吗
非常感谢您的帮助片段保留给lexer规则定义,不可用于解析器规则,在您的案例中不需要它
片段用于拆分复杂的lexer规则并引入可重用性,而无需生成专用令牌,例如:
NUMBER : DIGIT+;
ID : LETTER (LETTER|DIGIT)*;
fragment LETTER : [a-zA-Z];
frag
在ANTLR 4中,有没有一种方法可以访问解析器语义谓词中隐藏通道(或其他通道)上的令牌?
我想将\r\n发送到隐藏频道,因为我通常不需要EOL字符。但在某些情况下,在语义谓词中,我需要查看给定标记后是否有EOL。Tbh。我没有使用ANLTR 4的经验,但在ANTLR 3中,您可以使用令牌源来获取所有令牌,而不考虑通道。在版本4中,类似的东西当然也是可能的。我使用此功能恢复AST子树的原始输入(即从令牌流开始索引到结束索引)。是的,可以这样做。请看和以获取一些示例。第一个问题似乎直接解决了您关于
我正在尝试创建一种自定义语言,以将lexer规则与解析器规则分离。此外,我的目标是将lexer和解析器规则进一步划分为特定的文件(例如,公共lexer规则和关键字规则)
但我似乎无法让它发挥作用
虽然在生成解析器(.java文件)时没有收到任何错误,grun失败,线程“main”java.lang.ClassCastException中出现异常
注
我正在Windows7上运行针对Java的ANTLR4.7.2
代码
我创建了一组文件,这些文件与我想要实现的目标非常相似。下面的示例定义了一种名为
我正在解析PDF内容流。我在定义数组时遇到问题。PDF参考文件(PDF 32000-1:2008)中的数组定义为:
数组对象是按顺序排列的一维对象集合…数组的元素可以是数字、字符串、字典或任何其他对象(包括其他数组)的任意组合。一个数组可以有零个元素
数组应写成方括号内的对象序列(使用左方括号(5Bh)和右方括号(5Dh))
示例:[549 3.14 false(拉尔夫)/SomeName]
这是我语法的精简版本:
grammar PdfStream;
/*
* Parser Rules
及
“#”的前面和后面可以是跨越>1行和空格的多行注释。其他“#”可以作为运算符出现在行中,因此作为行中的第一个有效字符是关键要求
我们如何标记第一个有效字符
我试过这个
FIRSTHASH: {getCharPositionInLine() == 0}? ('/*' .*? '*/' | [ \t\f])* '#';
但这是错误的,因为这样的输入
/* */other line
/* S*/ /*SS*/#
被错误地认为是2个标记(1个大注释+一个“#”)。i、 e.*?错误地消耗了两
我正在尝试使用规范解析字符串
语法:
grammar SMILES;
atom: bracket_atom | aliphatic_organic | aromatic_organic | '*';
aliphatic_organic: 'B' | 'C' | 'N' | 'O' | 'S' | 'P' | 'F' | 'Cl' | 'Br' | 'I';
aromatic_organic: 'b' | 'c' | 'n' | 'o' | 's' | 'p';
bracket_atom:
我正在为basic方言编写一个antlr语法文件。大部分工作都在进行中,或者我对下一步需要做什么有了很好的想法。然而,我根本不确定我应该如何处理用于等式测试和赋值的“=”字符
例如,这是一个有效的语句
t = (x = 5) And (y = 3)
如果x等于5,则进行计算;如果y等于3,则对这些结果执行逻辑“与”,并将结果分配给t
我的语法将解析这个;虽然这是错误的,但我认为,一旦模棱两可的问题得到解决,这将自行解决
如何区分“=”字符的两种用法?
1) 我是否应该从表达式中删除赋值规则
根据权威的ANTLR4参考,我已经运行了第一个示例,它已经生成了JAVA目标。在目录C:\JavaLib中,我有antlr-4.5-complete.jar
当我试图用
javac -classpath C:\JavaLib *.java
它会创建以下错误消息
helloBaseListener.java:13: error: class HelloBaseListener is public, should be declared in a file named HelloBaseListe
我尝试使用以下语法分析日期:
grammar Dates;
formattedDate : (DATE '/' MONTH '/' year);
year : SHORT_YEAR | FULL_YEAR;
SHORT_YEAR : DIGIT DIGIT;
FULL_YEAR : ('19' | '20' | '21') DIGIT DIGIT;
DATE : (('0'..'2')? DIGIT) | '30' | '31';
MONTH : ('0'? DIGIT) | '11' |
我有下面的语法,我正试着慢慢地开始,努力移动复杂的参数
grammar Command;
commands : command+ EOF;
command : NAME args NL;
args : arg | ;
arg : DASH LOWER | LOWER;
//arg : DASH 'a' | 'x';
NAME : [_a-zA-Z0-9]+;
NL : '\n';
WS : [ \t\r]+ -> skip ; // spaces, tabs, newlines
D
我需要为这种类型的逻辑实现一个解析器:
S字符是语法的初始字符;五十、 T、R、V、K、D、F和E表示非终端字符。终端字符c对应于任务中指定的两种标量类型之一。终端字符t对应于类型部分中可以描述的数据类型之一。
我创建了以下语法:
grammar Parse;
compileString: S+;
S: TYPE L VAR R;
L: T (SEPARATOR|SEPARATOR L);
R: V (SEPARATOR|SEPARATOR R);
V: [a-zA-Z] ([a-zA
我正在扩展基类侦听器,并试图读入一些值,但是顺序中似乎没有任何层次结构
我的语法的简化版本如下:
start: config_options+
config_options: (KEY) EQUALS^ (PATH | ALPHANUM) (' '|'\r'|'\n')* ;
KEY: 'key' ;
EQUALS: '=' ;
ALPHANUM: [0-9a-zA-Z]+ ;
但是,此实现的解析树在配置_选项级别(终端级别)是平坦的,即规则start有许多配置_选项的子项,但EQUALS不
我正在设计一种低标点语言,希望使用以下语法支持数组声明:
512 by 512 of 255 // a 512x512 array filled with 255
100 of 0 // a 100-element array filled with 0
expr1 by expr2 by expr3 ... by exprN of exprFill
这些数组声明只是众多表达式中的一种
我很难想出如何写语法规则。我已将语法简化为最简单的东西,重现了我的麻烦:
grammar Dimensio
我正在完成一个专有模式语言的语法。它借用了一些正则表达式语法元素(如量词),但它也比正则表达式复杂得多,因为它必须允许宏、不同的模式样式等
我的问题是“*”与ID lexer规则不匹配。在我看来,没有其他规则可以吞下*标记
这是我写的语法:
grammar Pattern;
element:
ID
| macro;
macro:
MACRONAME macroarg? ('*'|'+'|'?'|FROMTIL)?;
macroarg: '['
我有一个我认为非常简单的语法:
我希望它允许一个叫做事实的标记。这些标记可以以字母开头,然后允许任何类型的标记:字母、数字、%或_
我想用一个例子来说明两个事实。但第二个事实不必以字母开头(数字、%或u从第二个标记开始也是有效的)
整个事实中的任何“子行为”(甚至是初始行为)都可以像数组一样“实例化”(您可以通过阅读我的示例获得它)
例如:
福
富%
富奥12%
富吧
Foo.%Bar
Foo.4_酒吧
傅[42]
Foo['instance'].Bar
等
我试着写这样的语法,但没法用:
我一直在研究antlr4语法的Z表示法(ISO UTF版本),该规范要求一个lex阶段,然后是一个“2阶段”解析。
您首先将其lex成一组名称(或DECORWORD)标记,然后根据规范解析器语法中的运算符模板规则解析生成的标记,替换适当的标记,最后解析新修改的标记流以获得AST
我已经完成了上面的工作,但是我不知道如何动态地设置解析器规则的优先级和关联性,所以解析树是错误的
运算符语法如下所示(数字优先):
我没有看到任何api来设置规则的关联性,所以我尝试使用语义谓词,比如:
expressi
我想分析以下示例:
class A {
private int main(i<a) {
}
}
如果我这样修改语法:
params : '(' ')' | '(' param_list ')';
将显示预期的错误 你的语法模棱两可(而且不完整,因为这里没有给出表达规则)param_list有一个空alt,与'('')部分相同。另外,在参数列表中不需要左递归。相反,请尝试以下方法:
params: '(' param_list? ')';
param_list: type
我是antlr新手,正在尝试解析我的一个文件(IBMDataStageExport)
我有一个工作语法,但我不完全满意,我不确定我是否正确使用了antlr:(
以下是源文件的示例:
BEGIN HEADER
CharacterSet "CP1252"
ExportingTool "IBM InfoSphere DataStage Export"
ToolVersion "8"
ServerName "MIAIBV240"
ToolInstanceID "DFDMG
为什么C语法中的Antlr4无法解析“FunctionDefinitionContext”的“declarator”,而“declarationList”只包含一个作为指针的参数
因此,如果我分析以下函数:
int打印队列(int idx,void*数据)
解析器作为声明器检索打印队列
解析时:
int销毁队列(无效*数据)
解析器将(void*data)作为声明器进行检索(我认为它将其视为函数指针)
如何解决此问题?这是中的一个错误。这个bug也被发现了
问题是C的语法在类型转换方面存在歧义。
我正在创建一个语法,它将用于创建C#的词法分析器和解析器。这将接受下面的输入并输出SQL
(path.path.path=“如何做某事”)
目前,我使用以下方法忽略空白:
WS:[\t\r\n]+->skip;//跳过空白
问题是,当我阅读引号中的内容时,我需要保留空格,因为它将用于搜索。
我该怎么做呢?
多谢各位
编辑1
以下是我当前解析字符串的尝试:
TEXT : [a-zA-Z_]+;
我刚刚遇到的问题并不多,但我找不到一个我理解如何实现的解决方案
我还补充说
我有一个要求,我想用语法B中定义的附加项扩展现有的语法a,以生成语法C
我已经尝试过在B中导入语法A,但这只选择了语法A中定义的某些内容。我的猜测是,在生成类时跳过了B中A未使用的内容。这是有道理的,因为要求不是继承而是混合/合并/组合这两个语法
为了便于理解(原始语法非常庞大),举个例子:
文件:A.g4:
grammar A;
keywords
: X
| Y
| Z
;
X: 'X';
Y: 'Y';
Z: 'Z';
grammar B;
keyw
对于表达式,我有一些规则:
e:
e '*' e |
e '+' e |
e '<' e |
'2';
e:
e'*'e|
e'+'e|
回答这个问题已经很晚了,但是
最好的处理方法似乎是将表达式分成两位,一个布尔表达式和一个数值表达式
exp:
numeric |
boolean
boolean:
numeric '<' numeric;
numeric:
numeric '*' numeric |
numeric '+
我正在写一个处理标量和向量表达式的语法。下面的语法经过简化,以显示我遇到的问题:标量表达式可以从向量派生,向量可以从标量派生。例如,向量可以是文字[1,2,3]或标量与向量2*[1,2,3]的乘积(相当于[2,4,6])。标量可以是文本2或向量[1,2,3][1](相当于2)的索引
ANTLR4给了我一个错误:以下规则集是相互左递归的[scalar,vector]。这是有意义的,因为标量引用向量,反之亦然,但同时它应该是确定性的
如何重构该语法以避免相互(间接)左递归?我可以,但这会在完整语法中
我需要用Antlr4实现泛型。为了做到这一点,我需要能够获取一个类,并在使用它时,像宏一样为它动态生成代码,标记该代码,生成一个树,然后将新树添加到原始解析树中
我看过这两节课
但是,我不确定它们实际上做了什么,也不确定如何使用构造函数
ParserRuleContext(ParserRuleContext父级,int invokingStateNumber)
RuleContext(RuleContext父级,int invokingState)
具体地说,这些类是表示新树的类吗?我应该传
使用Antlr 4时,我遇到了一个不确定如何解决的问题。我最初是在Antlr论坛上问这个问题的。但那个论坛似乎并没有获得很多流量,所以我在这里再次提问
我的语法如下:
expression
: ...
| path
;
path
: ...
| dotIdentifierSequence
;
dotIdentifierSequence
: identifier (DOT identifier)*
;
这里需要考虑的是,dot
expr和condition给了我这个错误,似乎antlr把它看作一个可能的无限递归循环。我怎样才能避免呢
query : relationName '<-' expr;
relationName : identifier ;
identifier : (LETTER | IDENTIFIER1 | IDENTIFIER2)+;
expr : atomicExpr
| selection
| projection
| renaming
我想用ANTLR 4验证G4结构文件。。。可能吗?您正在寻找ANTLRv4Parser.g4和ANTLRv4Lexer.g4。您可以在实用书架网站(pragprog.com)上的“权威ANTLR 4参考”一书的源代码下载中找到它们。检查代码/参考目录。您的意思可能重复?检查语法本身的正确性?(埃里斯·莫伊,我的传统)你好,谢谢你的帮助。这是一种传统的java代码伪“C”的方法。但代码“包括”注释类型“n:=12!注释”。。。。你知道g4的语法是什么吗?用伪JAVA编码?谢谢
我能够从我的解析器类中获得org.antlr.v4.runtime.tree.ParseTree类的对象。现在我想访问每个节点,并根据树节点类型生成自定义输出。如何在ANTLR4中实现这一点?没有像getTreeNodeType()这样的方法 Java提供了一个可以使用的getClass()方法。除此之外,您还需要更具体地了解所需的信息。Java提供了一个可以使用的getClass()方法。除此之外,您还需要更具体地了解所需的信息。假设您有解析器。\uu上下文。它具有ParseTree类型的子数
我用antlr4编写了语法,我想知道有什么工具可以为我自己的语言创建IDE。我想制作一个支持语法高亮显示、语法检查和自动补全的IDE。然而,我不知道从哪里开始
有没有人已经根据Antlr4语法做过一次
谢谢
阿德里安
我是Antlr新手,需要为可能在固定列中有行号的遗留汇编代码编写解析器。此外,某些栏目也有重要意义——无论是评论、续篇等。我如何检测这些栏目
举几个例子:
000001进程进程1
000002*评论
* comment without line numbers
continuation marker set ==> X
Arbitrary text as continuation
谢谢
xAn在编写Antlr语法
我想验证我的ANTLR 4语法是否为LL(1)。ANTLR 4中有类似的东西吗
我仔细看了一遍,但什么也没找到。尽管似乎特别缺乏,但我甚至没有找到所有可能选项的列表。ANTLR 4的设计目标之一是让语言设计师能够专注于编写准确的语法,而不是担心诸如“LL(1)”之类的特性,这些特性对语言用户几乎没有影响
但是,您可能可以通过检查生成的解析器来识别LL(1)语法。如果生成的代码中没有调用adaptivePredict,则语法为LL(1)。这样做的目的是为了使反向也是正确的,但考虑到调用adapti
有人能解释一下我的代码有什么问题吗?这是我的错误:
谢谢你的帮助 问题在于这些lexer规则:
grammar Hello;
prog: stat+ EOF;
stat: expr NEWLINE # printExpr
| ID '=' expr NEWLINE # assign
| NEWLINE # blank
| STRING NEWLINE # string
;
expr: expr (MUL|DIV) expr # o
我正在使用ANTLR4构建AST树,我从以下位置下载g4文件:
在g4文件的头部添加选项:
options{
output=AST;
ASTLabelType=CommonTree;
language=Java;
}
但在编译g4文件时,它输出:
ANTLR Tool v4.6 (D:\antlr-4.6-complete.jar)
SQLite.g4 -o C:\Users\macro\workspace\tdsql\target\generated-
我正在尝试匹配“Hello.World”,其中单词之间的是必须的,但是我的语法似乎不起作用。如何修复它?如果可能的话,我希望在点之前和之后至少有一个字符。您似乎希望匹配“Hello.World”作为完整的标记。如果没有,请告诉我。为此,一个非常简单的方法就足够了:
grammar h1;
column_name
: '"' ALPHANUMERIC '.' ALPHANUMERIC '"'
;
ALPHA : [a-zA-Z]+ ;
fragment ALPHANUMER
这本书给出了一个注释重写的例子,用于重构旧代码
public void exitVarDecl(..) { // lexmagic/ShiftVarComments.java
Token semi = ctx.getStop();
int i = semi.getTokenIndex();
List<Token> cmtChannel =
tokens.getHiddenTokensToRight(i, CymbolLexer.COMMENTS);
和解析树:
但是,不带“=0”的输入有助于解析
int t;
解析失败,出现“无可行替代方案”错误(控制台中打印的数字是作为测试条件验证的$decl\u specifier\u cnt::cnt值的调试打印)。i、 e.语义谓词不能阻止将t解析为type\u说明符,并且t不再被视为init\u说明符。这里有什么问题?这是因为使用了一个上下文相关谓词,该谓词具有$decl\u说明符\u seq::cnt
这是否意味着上下文相关谓词不能用于实现“计算子节点数”逻辑
编辑
我尝试了新版本,其谓词
我的语法包含以下内容(简明):
SPECIALFUNCTION的可能值列表可以并且将随着时间的推移而改变。代码中的其他地方也使用了这些名称,因此,与其在语法和代码中硬编码它们,我希望有一个方法返回有效的特殊函数,然后可以从代码和语法中的不同位置调用这些函数
SPECIALFUNCTION : <make a call to get the current list of SPECIALFUNCTIONS e.g. SomeClass.GetListOfNames>
public S
如何匹配最后一行在最后一行没有换行符的文件
结束。当我使用注释行(w/EOF)时,解析器进入什么
看起来像一个无限循环(即挂起)
这里有一个语法-主要是从tparr的作品中借来的
grammar csv;
prog : row+ ;
row : field (',' field)* NL;
// row : field (',' field)* (NL|EOF); // doesn't work
field : STR | QSTR | ; // field can be empty
我有一个非常简单的语法来解析骰子表达式
grammar Dice;
function : ( dice | binaryOp | DIGIT );
binaryOp: dice OPERATOR function | DIGIT OPERATOR function;
dice : DIGIT DSEPERATOR DIGIT EXPLODING?;
DSEPERATOR : ( 'd' | 'D' | 'w' | 'W' );
EXPLODING : ( '*' );
OPERATOR : (
ANTLR4书引用了一个多模式示例
与
有没有我不见的安特福?这是在使用antlr4 maven插件
wiki提到了一些类似的内容,但我的阅读方式与github上的示例和使用时的轶事经历相矛盾,出现了以下情况之一:
您忘记在ModeTagsLexer.g4中更新OPEN规则以使用以下表单:
OPEN : '«' -> mode(ISLAND) ;
您在Antlr4中发现了一个bug,应该向管理员报告
您是否指定了ANTLR在读取语法时应该使用的文件编码?欧洲字符少于255应该没问题
在anltr4 java语法()中,我想知道何时有完整的表达式。在本例中,我尝试进行类似以下的转换:
from: String foo = bar + ", " + baz + "; are true";
to: String foo = String.format("{0}, {1}; are true", bar, baz);
问题从语法的声明开始:
expression ('+'|'-') expression"
这也是一个表达的孩子。鉴于上述示例,回调将类似于以下内容:
0:
一、 我试图将antlr4与语法一起使用,以实现idl文件应该遵循的一些检查。一条规则是关于名字的。规则如下:
ID仅包含字母、数字和符号下划线
我以一封信开头
ID以字母或数字结尾
ID不是艾达、C、C++、java、IDL中的保留字
执行此检查的一种方法是编写一个函数,用于检查这些属性的字符串,并在每个具有ID的规则的出口侦听器中调用它。例如,在exitConst_decl()、exitInit_decl()、exitSimple_declarator()和许多其他位置中(参考IDL.
我有一个非常简单的语法,它试图将“é”与标记E_代码匹配。
我已经使用TestRig工具(带-tokens选项)对其进行了测试,但解析器无法正确匹配它。
我的输入文件是用UTF-8编码的,没有BOM,我使用的是ANTLR版本4.4。
其他人也可以检查一下吗?我在控制台上获得了以下输出:
第1行:0“Ă”处的令牌识别错误
grammar Unicode;
stat:EOF;
E_CODE: '\u00E9' | 'é';
我测试了语法:
grammar Unicode;
stat: E_
我试图在lexer中使用语义谓词来预测一个标记,但不知何故,我无法正确地得到它。以下是我所拥有的:
词汇语法
lexer grammar TLLexer;
DirStart
: { getCharPositionInLine() == 0 }? '#dir'
;
DirEnd
: { getCharPositionInLine() == 0 }? '#end'
;
Cont
: 'contents' [ \t]* -> mode(CNT)
因此,我正在使用ANTLRWorks 2.1在ANTLR4中编写一个组合语法。我有lexer规则Identifier和Block,它们没有被识别为已定义的lexer规则,但仅在定义的最后一个解析器规则中。在这些规则之后添加文字将删除(或隐藏)这些错误
我的语法结尾有错误(斜体标记抛出错误):
语法组合;
选项{language=Cpp;}
@lexer::命名空间{AntlrTest01}
@解析器::命名空间{AntlrTest01}
/*第一Lexer级*/
位:“0”|“1”;
数字:“0
我有一个antlr语法,其中嵌入的操作用于自底向上收集数据并构建聚合数据结构。下面给出了一个简短的版本,其中只打印聚合的数据结构(即在这个简短的示例代码中没有为它们创建类)
由于antlr的目标之一是保持语法文件的可重用性和动作独立性,因此我尝试从该文件中删除动作并将其移动到树漫游器。我第一次尝试使用以下代码:
public class Main {
public static void main( String[] args) throws Exception
{
Sampl
我想解决以下歧义:
grammar test;
WS : (' ' | '\t' | '\n' | '\r' | '\f')+ -> skip;
program
:
input* EOF;
input
: '%' statement
| inputText
;
inputText
: ~('%')+
;
statement
: Identifier '=' DecimalConstant ';'
上一页 1 2 3 4 5 6 ...
下一页 最后一页 共 15 页