ANTLR使用的推荐模式是让解析器构造一个抽象语法树,然后构建树遍历器(也称为树语法)来处理它们
我正试图弄清为什么我的树语法不起作用,并希望使用ANTLRWorks的调试器,就像我在解析器中使用它一样。解析器的输入是“源代码”,但树解析器的输入是解析器的AST结果。我不知道如何将其作为测试树语法的输入
目前还不清楚是否有办法在AntlWorks中测试树语法。如果能够做到这一点,我们将非常感谢指向正确方向的指针。如果您确信您正在构建的AST很好(使用AntlWorks调试器),那么树漫游测试与测
我正试图为一种只剩下递归的简单语言编写语法,但我真的不明白如何编写
基本上我的语法是这样的:
expr: expr('@'TYPE)? '.' ID '(' (expr ',')∗ ')'
| expr '+' expr
| ID
| INTEGER
| STRING
INTEGER : ('0'..'9')+;
STRING : '"' ('a'..'z' | 'A'..'Z' | '0'..'9')* '"';
TYPE : ('String' | 'Bool' | 'Int')
ID
当在第三行输入以下错误输入时:
SELECT entity_one, entity_two FROM myTable;
first_table, extra_table as estable, tineda as cam;
asteroid tenga, tenta as myName, new_eNoal as coble
我使用antlrWorks对其进行了调试,发现与第三行对应的错误消息显示在调试器输出窗口中:
输出/\uuuuu测试\uuuuuuuu输入.txt第3:8行必需…+循环与
我有一个模板语言的语法
我为Antlr 3.2和CSharp2目标创建了这个,并使其正常工作
现在,我尝试更改为antlr 3.4和CSharp3目标(也尝试了CSharp2),在synpred函数中的解析器中出现了一个奇怪的错误
几个变量声明缺少变量名:
IToken = default(IToken)
有些也有错误的类型
void = default(void);
应该是
AstParserRuleReturnScope<CommonTree, IToken> = de
当我用这些规则拿到代币时
STRINGA : '"' (options {greedy=false;}: ESC | .)* '"';
STRINGB : '\'' (options {greedy=false;}: ESC | .)* '\'';
它最终抓取的是'text',而不是text。我自己可以轻松地删除'和',但我想知道如何让ANTLR删除它?一种方法是将字符串内容定义为一个单独的类别,例如
STRINGA : '"' STRINGCONTENTS '"';
STRINGB
标签: Antlr
semanticspredicates
我试图使用ANTLR对mqsi命令建模,但遇到了以下问题。mqsicreateconfigurableservice的文档表示队列前缀:
前缀可以包含WebSphere®MQ队列名称中有效的任何字符,但长度不得超过八个字符,且不得以句点开头或结尾。。例如,SET.1有效,但.SET1和SET1无效。无效。多个可配置服务可以使用相同的队列前缀
我使用了以下方法作为权宜之计,但这种方法意味着我必须至少有两个字符的名称,这似乎是一个非常浪费且不可扩展的解决方案。有更好的方法吗
请参阅下面的“queue
我有一个包含以下规则的语法:
expr:
unaryExpr '(' (stat | expr | constant) ')' #labelUnaryExpr
| binaryExpr '(' (stat | expr | constant) ',' (stat | expr | constant) ')' #labelBinaryExpr
| multipleExpr '
我对ANTLR没有任何先验知识(我最近学习了一点ANTLR4),但我必须将一个旧语法翻译成一个新版本,eclipse告诉我,对于这些字符,它们是不可行的替代品,并且显示语法错误“'!”让我完全吃惊”。
我已经删除了这些字符,这不成问题,但可能它在ANTLR3中有一个特殊的功能。
提前谢谢
global_block:
DATABASE! IDENTIFIER!
| GLOBALS! define_section!+ END! GLOBALS!
| GLOBALS! STRING!
我有一个语法,可以解析如下的点概念表达式:
a、 不列颠哥伦比亚省
这可以很好地解析表达式,并提供如下树结构:
MemberExpression(
MemberExpression(
ParameterExpression("c"),
"b"
)
, "a"
)
MemberExpression(
MemberExpression(
ParameterExpression("a"),
"b"
)
, "c"
)
但我
如何使用具有相同起始的lexer规则
我尝试使用两个类似的lexer规则(具有相同的开始):
以下是我的语法示例:
grammar TestTime;
text : (timeexpr | caseblock)*;
timeexpr : TIME;
caseblock : INT COLON ID;
TIME : ('0'..'9')+ ':' ('0'..'9')+;
INT : ('0'..'9')+;
COLON : ':';
ID
我正在编写一个小型csharp控制台应用程序,它从控制台读取文本,执行一些操作并返回一个字符串。为此,我使用Antlr。语法文件如下所示
grammar test;
options {
language = CSharp2;
output = AST;
}
start returns [String res]: expression EOF
{
$res=$expression.res;
} ;
expression returns [String res]
: Ide
假设我有一个简单的语法(lexer和parser),用于解析和计算简单的数学表达式(如一些antlr示例),它还允许简单的变量定义(即分配浮点值)和使用这些变量。例如,可以处理以下问题:
r = 2.5;
PI = 3.14;
PI * r * r;
这应该用在更复杂的语法中。事实上,有几个不同的。
问题是,上面包含的lexer基本上将每个字符串识别为令牌类型ID,即潜在变量名,但更复杂的语法可能包含其他关键字
如果我这样做
lexer grammar ComplexLexer;
imp
我只是想让ANTLR按照这些说明运行:
语法被翻译成代码,但是当我想调用TestRig时,我得到了一个错误“无法将Hello作为lexer或解析器加载”
TestRig位于文件C:\bin\grun.cmd中,包含以下命令
java-cp。;C:\LIBS\Java\ANTLR\ANTLR-4.1-complete.jar
org.antlr.v4.runtime.misc.TestRig%1%2
有什么问题吗
当我尝试从ANTLWorks IDE启动TestRig时,我收到如下警告:
警告:批
使用最新的ANTLR Works 1.5和以下语法:
语法测试法
ID:('a'..'z'.'a'.'z'.'')('a'.'z'.'a'.'z'.'0'.'9'.'')*
;
WS:(“”
|“\t”
|“\r”
|“\n”
)
;
ws:(ws)*
;
id:id
;
表情
:id
|方法
;
方法
:标识符ws'('ws')'
;
标识符
:(id(选择器)*'。)?身份证件
;
选择器
:
“.”id
|“['ws-expression-ws']”
;
当提交以表达式开头的abcd时,
我试图解决一个非常简单的语法问题,我刚刚开始学习如何使用ANTLR来开发语法;我是一个有点新的,所以请容忍我使用ANTLR定义一个有符号偶数
起始令牌的“+”或“-”是可选的,数字可以是1个或多个数字,但最后一个数字必须是偶数。例如,+4394将是有效的有符号偶数
到目前为止,我掌握的最好语法如下:
grammar SignedEvenNumber;
DIGIT : '0'..'9';
EVEN_DIGIT : '0' | '2' | '4' | '6' | '8
我试图在Windows上安装Antlr 4.4,目的是使用pyfuzzy,这是一个用于模糊逻辑的Python库,依赖于Antlr的Python运行时来运行。我曾经尝试(天真地)在不安装Antlr的情况下获得Python(2.7)的Antlr运行时,当然没有成功
因此,我尝试按照Windows的说明安装Antlr,但每次尝试运行时都会出现错误:
Error: Could not find or load main class org.antlr.v4.Tool
jar文件位于C:\JavaLib
这是我的语法文件…我的输入是
grammar Poly;
options
{
output=AST;
ASTLabelType=CommonTree;
}
poly
:
term(TLK^ term)*
;
term
:
a=ID b=INT -> ^($a $b)*
;
INT:'0'..'9';
ID:'a'..'z';
TLK:('PUSH'|'POP');
Semi : ';' {skip();};
Space
我试图编写一种语法,将识别为特殊标记,但将视为普通文本
这是我的语法:
grammar test;
doc: item+ ;
item: func | atom ;
func: '<<' WORD '>>' ;
atom: PUNCT+ #punctAtom
| NEWLINE+ #newlineAtom
| WORD #wordAtom
;
WS : [ \t] ->
如何在输入规则时更改其文本
示例:我在语法文件中定义了一个名为name的规则,然后我想将规则name的文本更改为name.getText+“some string”每次输入funcenterName,怎么做
目标:
输入:我的名字是彼得
输出:我的名字是peteraaaaa
我可以通过向节点添加子节点来管理此操作吗?简单的方法是将从树中获取的文本与要添加到树中的文本连接起来。
例如:在javascript中
Listener.prototype.exitSetVar = function (ct
我必须在ANTLR语法中实现以下内容
INPUT → EXPR ;
EXPR → if EXPR then EXPR else EXPR
| { EXPR (; EXPR)* }
| ! EXPR
| id := EXPR
我已经为“expr”完成了,但是在为“expr”编写时出错了!expr
input : expr SEMICOLON;
expr : IF expr THEN expr ELSE expr
| ID
ANTLR4 lexer模式[\p{Emoji}]+与数字匹配。见截图。请注意,它正确地拒绝alpha字符。模式有问题吗
查看似乎定义了表情符号代码点的代码:
UnicodeSet-emojiRKUnicodeSet=newunicodeset(“[\\p{GCB=Regional\u Indicator}\\\\*\\\\\\\\ 0-9\\u00a9\\u00ae\\u2122\\u3030\\u303d]”);
它看起来包含了数字(为什么,我不知道,这是sepp2k极好的解释)。如果你觉
在哪里可以找到在C/C++中使用Antlr的好文档?
我有一本权威的Antlr参考书,但它只用Java解释了一些事情
谢谢
Ajay在Antlr网站上有一些有用的东西。这篇文章特别有助于您:
在Antlr网站上有一些有用的东西。这篇文章特别有助于您:
权威Antlr在第105页的语言选项的脚注中有此建议:
”“瞧
有关ANTLR的最新信息
语言目标。”
这导致了一长串Antlr支持已经完成或正在开发的语言。C行链接到,该行提供状态、策略、支持的平台以及到的链接
免责声明:我仅将Antlr与Jav
我有一个问题,我已经坚持了一段时间,如果可能的话,我会感谢一些帮助
我在ANTLR树语法中有一些规则:
我已经编写了一个Java类VarTable,我将在源文件开头声明变量时将所有变量插入其中。该表还将保存它们的变量类型(即实数或整数)。我还可以使用这个变量表来检查未声明的变量或重复声明等
因此,基本上我希望能够将变量类型从“声明”规则发送到“idlist”规则,然后循环遍历idlist规则中的每个标识符,将它们逐个添加到我的变量表中
我遇到的主要问题是,如果“声明”规则中的$t变量(这是一个引
标签: Antlr
antlr3parser-generator
如何在ANTLR的词法分析器规则中使用否定元字符~?否定可以发生在内部
在lexer规则中,您可以对字符求反,在解析器规则中,您可以对令牌求反(lexer规则)。但是lexer和parser规则只能分别否定单个字符或单个标记
举几个例子:
lexer规则
要匹配除小写ascii字母以外的一个或多个字符,可以执行以下操作:
NO_LOWERCASE : ~('a'..'z')+ ;
p : ~(B | D) ;
(否定元字符~的优先级高于+,因此上述规则等于(~(a'..'z'))+)
请注意
标签: Antlr
lexical-analysislines-of-code
我正在尝试使用ANTLR来分析使用完整Java语法的大量代码。由于ANTLR需要打开所有源文件并扫描它们,我想知道它是否也可以返回代码行
我检查了Lexer和Parser的API,似乎它们没有返回LoC。在语法规则中加入一些工具以获得LoC是否容易?完整的Java规则很复杂,我真的不想把它的大部分弄乱 如果您有一个现有的ANTLR语法,并且希望在解析过程中计算某些内容,您可以执行以下操作:
grammar ExistingGrammar;
// ...
@parser::members {
在antlr文档中,我看到了以下两条规则,但它们的描述听起来完全相同。这两条规则有什么区别
a : INT ID -> ID INT ; // reorder nodes
a : ^(ID INT) -> ^(INT ID) ; // flip order of nodes in tree
还有,为什么不这样写第二条规则呢?或者说,第二条规则与第一条规则相同,所以规则之间没有区别
a : ^(INT ID) -> ^(ID INT) ;
谢谢,
院长
^(INT-ID)表示
标签: Antlr
antlr3antlrworksantlr2
我有一个单独解析字母字符和数字的语法:
grammar Demo;
options
{
language = C;
}
program : process+
;
process : Alphanumeric {printf("\%s",$Alphanumeric.text->chars);}
;
Alphanumeric : (Alphabet | Number)+
;
fragment Alphabet : ('
我有一个相当复杂的ANTLR语法和许多自定义处理代码(其中包括用于创建内部数据结构和处理一般数据的代码)。我想知道的是,ANTLR是否提供了任何功能(或者是否有任何现有工具)来删除所有自定义语法处理(例如Java代码、@init、@after节、参数、返回类型等),并将基本语法定义留给我。我知道我可以通过一些正则表达式处理来做到这一点,但我想象这可能是一个重复的任务,所以可能已经有一些东西可以做到这一点
例如:
rule[String blabla] returns [blabla]
scope
默认情况下,由ANTLR 3.5生成的解析器类将错误条目写入SystemErr日志。是否有方法将这些条目定向到语法文件write中的自定义记录器(如基于Log4J的日志):
@members {
private static org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger("ClassName");
}
@rulecatch{
catch(RecognitionEx
我需要根据解析树中的结构和信息做出一些决定,这是我现在生成的树的一个示例:
生成代码的决策将取决于两个工作流之间的运算符(“;”、“和”、“或”、“异或”),例如,我需要从该树生成的代码是
mustPrecede(T6,T4) AND mustPrecede(T6,T1)
AND mustPrecede(T4,T5) AND mustPrecede(T1,T5)
为此,我需要找出T6和(T4和T1)之间的运算符是“;”(顺序合成运算符),以便作出决定,然后我需要找出T4和T1之间的运算
我正在构建以下语法:
Letter : 'a'..'z'|'A'..'Z' ;
Number : '0'..'9' ;
Float
: Number+ '.' Number+
;
a5
@init
{
int n = 1;
}
: ({n<=5}?=>(Letter|Number){n++;})+
;
但没有解决任何问题。有什么想法吗
更新
对建议的回应
我添加了以下规则
public test :
假设我有一个源代码文件。我想把这个文件交给ANTLR,生成相同的代码并将其保存到输出文件中
用法:
美化输入文件
向输入文件添加一些注释
向输入文件中插入一些代码
利用ANTLR有可能做到这一点吗
基本上,我正在尝试使用ANTLR从C/C++到C/C++进行源代码到源代码的转换
我有兴趣添加、删除、替换或修改一些代码行,并生成符合C/C++语言规则的输出
附言:如果你知道任何其他工具(除了叮当)可以做同样的事情,请告诉我。解析C/C++(甚至Fortran)并向用户提供一些事件,让用户修改源代
工程软件的结果文件由多个页面组成,每个页面有一行标题和一些数据行。
每个标题行包括:
行的第一个位置处的字符“1”
一些字母数字字符(不需要分析的一般数据)
行的位置122处的字符串“PAGE”
数字字符串(页码)
NL
此类标题行的一个示例是:
软件会在页面编号后指定接下来的六个字符
解析器工作正常,除了超过99999页的文档,软件输出的字符串如PAGE123456,在页码和页码之间没有空格(是的,一些软件生成的数据量如此巨大)
我尝试的第一个语法是:
grammar F06Reader01
我有一种编程语言,其中有许多结构,但我只对从该语言中提取表达式感兴趣
不必写完整的语法就能做到吗?是的,这是可能的。您需要所谓的孤岛解析器。实际上你可能不会
决定这样做,更多如下
其基本思想是为您关心的语言岛部分提供详细的语法规则,为其余部分提供粗略的规则
详细的语法规则。。。你像平时那样写。这包括构建一个lexer和解析器来解析所需的部分
通过定义松散的词素,可以尽可能多地实现“水”部分。您可能需要不止一个,并且您可能必须处理嵌套结构,例如,涉及。。。[…]和{…}最终将使用这些结构边界的显式
我不希望ANTLR生成的文件与我的.g4语法和其他版本控制文档位于同一位置。我想将所有生成的文件放在一个单独的嵌套文件夹中,该文件夹可以通过.gitignore排除。到目前为止,我尝试在主文件夹中创建一个文件夹,然后从该文件夹中运行:
cd <someFolder>
antlr ../<grammarFile.g4>
cd
antlr/
但是,它仍然会溢出父文件夹中生成的所有文件
p.S.这不重要,但我的环境是macOS。来自:
-奥特迪尔
默认情况下,ANTLR在当
有了一个antlr侦听器,它可以遍历解析树,我就能够构建一个我需要的信息的Arraylist。但我正在努力从听众之外提取这些信息
期望的例子是:
...
ParseTreeWalker.DEFAULT.walk(Listener, tree);
ParseTree tree = myParser.statements();
//I want to use my Arraylist here
...
由于侦听器没有返回值,有什么方法可以这样
在同一语法中解析有效日期和数字的最简单(最短、最少规则和无警告)方法是什么?我的问题是,匹配有效月份(1-12)的lexer规则将匹配1-12的任何事件。因此,如果我只想匹配一个数字,我需要一个解析规则,如:
number: (MONTH|INT);
当我为日和年添加lexer规则时,它只会变得更复杂。我想要一个日期解析规则,如下所示:
date: month '/' day ( '/' year )? -> ^('DATE' year month day);
date: month=
我试图在D中实现嵌套注释
nestingBlockComment
: '/+' (options {greedy=false;} :nestingBlockCommentCharacters)* '+/' {$channel=HIDDEN;}; // line 58
nestingBlockCommentCharacters
: (nestingBlockComment| '/'~'+' | ~'/' ) ; //line 61
对我来说,这应该是合乎逻辑的
This is t
我已经创建了以下语法:我想知道如何构建一个用java返回树的解释器,稍后我可以用它在屏幕上打印,Im位堆栈如何开始
grammar myDSL;
options {
language = Java;
}
@header {
package DSL;
}
@lexer::header {
package DSL;
}
program
: IDENT '={' components* '}'
;
components
: IDENT '=('(shap
标签: Antlr
abstract-syntax-treeantlrworks
我正试图了解ANTLR中的树构造操作员(^和!)
我有一个flex字节数组的语法(UINT16描述数组中的字节数,后跟这么多字节)。我已经注释掉了所有语义谓词及其关联代码,这些代码确实验证了数组中的字节数是否与前两个字节所指示的字节数相同……这部分不是我遇到的问题
我的问题是解析某些输入后生成的树。所发生的只是每个角色都是一个同级节点。我希望生成的AST类似于您可以在AntlWorks 1.4的解释器窗口中看到的树。当我尝试更改使用^character创建树的方式时,我得到一个例外:
Unhan
我在Python中使用ANTLR语法。它以前工作正常,但现在在导入lexer时出现以下错误:
ValueError:错误的版本字符串'!未知版本
我可以追溯到antlr3可执行文件:
$antlr3-版本
ANTLR解析器生成器版本!未知版本
生成的解析器和lexer看起来不错,除了版本字符串。我使用的是Ubuntu存储库(12.04)提供的antlr3。我想我可以手动安装ANTLR,但我认为这应该是开箱即用的-也许我在某个地方配置错误了?。我是否缺少一个已知的技巧,或者这是一个bug?我一直在
假设我有以下规则。我想将TYPE_ID设置为可选,但如果缺少,则将其替换为AST中的某个默认值
assignment : TYPE_ID? ID '->' expression
TYPE_ID : ('A'..'Z')('a'..'z'|'A'..'Z'|'0'..'9')* ;
例如,给定上述规则,我要解析以下代码,假设expression可以根据需要工作
monday -> 1.
Number tuesday -> 2.
我想让AST在树中的monday前面有一个东西
我正在尝试编写自定义的checkstyle规则。我对TokenTypes.STRING\u LITERAL感兴趣。这种方法的问题是,字符串可能是串联字符串、StringBuffer、StringBuilder,也可能在方法中
请容忍我,因为我是Checkstyle编码的新手
如果连接了完整字符串,如何获取该字符串。aAST似乎将它们作为单个字符串文本输出
有没有其他方法可以获取完整的字符串
非常感谢任何指针。这在Checkstyle中很难做到,因为Checkstyle完全在AST上工作。它不是编
我试图用ANTLR4解析N3
在伪ANTLR中:
{plain_is = plain_of = false}
document : (keywords | triple)* ;
keywords : '@keywords' NCNAME (',' NCNAME)* '.'
{plain_is = 'is' in ncnames
plain_of = 'of' in ncnames} ;
triple : value predicate value '.' ;
predicate :
我知道我可以通过多种方式(侦听器或访问者)重写(解析器)规则的文本
但是,我想处理一些特定词汇匹配的文本(Lexer规则)
假设我们使用java语法。我们有一个完整的关键字列表:
ABSTRACT : 'abstract';
ASSERT : 'assert';
BOOLEAN : 'boolean';
BREAK : 'break';
// 50 more or so...
这是一个采样输入:
public \t\t\t\t class Y
我有下面的语法(为了演示而简化),在一个与逻辑运算符相关的特殊情况下,我遇到了一个问题
除了逻辑运算符在我引用的标识符内的情况外,我测试的所有内容都有效。例如,这项工作:
@M=“ABC12345”
但这并不是:
@M=“ABC12OR345”
发生的情况是字符串中的OR导致以下错误
“外部输入”或“预期{'”,LOWCHAR
我的语法如下:
cell
: operator value
;
operator
: EQ
;
value
: StringCharacters
;
EQ
: '='
;
StringCharacters
: StringCharacter+
;
fragment
StringCharacter
: ~[\\\r\n]
;
WS : [ \t\r\n\u000C]+ ->
我想知道如何修复此错误
以下规则集是相互左递归的[类型,数组类型]
目标是实现以下目标:
(数组类型)类型->类型[expr]
应包含在类型参数中的。任何帮助都将不胜感激
以下代码:
// Types
type
: atomic_type
| named_type
| pointer_type
| record_type
| enclosed_type
| array_type
;
atomic_type
: VOID
| CHAR
| INTEGER
我试图在R语法中为原始字符串创建一个新规则
新闻引述:
有一种新的语法用于指定原始字符常量
到C++中使用的一个:r“(…)”带。。。任何字符序列都不是
包含序列“”。这使得编写
包含反斜杠或单引号和双引号。有关详细信息,请参阅
看到了吗?引用
示例:
## A Windows path written as a raw string constant:
r"(c:\Program files\R)"
## More raw strings:
r"{(\1\2)}
我不熟悉ANTLR并使用ANTLR4(4.7.2 Jar文件)。我目前正在研究Oracle解析器
有没有办法从解析器或词法分析器直接向AST添加节点(带有一些文本)?
我将注释隐藏在我的Lexer中,并希望将其直接添加到树中
可能吗?我相信Less4j允许类似的事情
有没有办法从解析器或词法分析器直接向AST添加节点(带有一些文本)
不是来自lexer:在那个阶段还没有解析树
从解析器中,您可以这样做,但是没有ANTLR API可以这样做。ANTLR为您提供解析树,就像它解析您的输入一样。它不允
上一页 1 2 3 4 5 6 ...
下一页 最后一页 共 35 页