标签: antlr

ANTLR4“+”操作

我正在使用 ANTLR4 来上课,我似乎理解其中的大部分内容,但我不明白“+”的作用。我只能说它通常位于括号中的一组字符之后。

parsing antlr lexer antlr4

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

如何在 antlr4 中修复外来输入 ' ' 期望

您好,当使用以下输入运行 antlr4 时,我收到以下 显示问题的错误图像

[图像显示问题[1]

我一直试图通过在这里和那里进行一些更改来修复它,但似乎只有当我在新行中编写whileLoop 的每个组件时它才有效。

你能告诉我我在这里缺少什么以及为什么问题仍然存在吗?

grammar AM;

COMMENTS :

'{'~[\n|\r]*'}' -> skip

;

body : ('BODY' ' '*) anything | 'BODY' 'BEGIN' anything* 'END' ;


anything : whileLoop | write ;

write : 'WRITE' '(' '"' sentance '"' ')' ;

read : 'READ' '(' '"' sentance '"' ')' ;

whileLoop : 'WHILE' expression 'DO' ;

block : 'BODY' anything 'END';

expression : 'TRUE'|'FALSE' ;

test …
Run Code Online (Sandbox Code Playgroud)

antlr antlr4

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

antlr语法中#的目的是什么

我在 ANTLR4 语法中有一个语句,例如:

expression : DEFAULT    #primitive_expression
           ;
Run Code Online (Sandbox Code Playgroud)

我不知道#这里是什么意思。

antlr antlr4

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

Antlr Parser运算符优先级

请考虑以下语法。我在运算符优先级方面遇到问题,例如:res = 2 * a + b具有与res = 2 *(a + b)类似的解析树。我知道问题出在哪里,但是我想到没有相互左递归的“美丽”解决方案。你能帮我一下吗。语法与自定义访问者一起使用。

grammar Math;

expression: expression add=('+'|'-') expression # expressionAddExpression
            | expression mult='*' expression    # expressionMultExpression
            |'(' expression ')'  # bracketExpression
            | number                            # numberExpression
            ;
    number: INT                                                                 #int
            | '(' number ')'                                                    #bracketNumber
            | VARIABLE                                                          #var

            ;
    VARIABLE: [A-Za-z][A-Za-z0-9]*;



INT: [0-9]+;
Run Code Online (Sandbox Code Playgroud)

grammar parsing antlr antlr4

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

pushMode、popMode、mode、OPEN 和 CLOSE 在词法分析器语法中是什么意思?

我正在研究词法分析器和解析器语法,并使用 ANTLR 来创建基于 .g4 文件的解析器和词法分析器。但是,我很困惑 pushMode 和 popMode 通常做什么?

OPEN                : '[' -> pushMode(BBCODE) ;
TEXT                : ~('[')+ ;

mode BBCODE;

CLOSE               : ']' -> popMode ; 
Run Code Online (Sandbox Code Playgroud)

词法分析器语法中的 OPEN、pushMode、BBCODE、CLOSE 和 popMode 是什么意思?我尝试搜索这些模式,但没有明确的定义和解释。

parsing antlr lexer antlr4

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

如何在 Antlr4 的解析树中检测空格?

当一个规则在 antlr4 中匹配,并且您获得该规则的文本时,词法分析器通常会删除空格

WS: [ \n\t\r]+ -> skip;
Run Code Online (Sandbox Code Playgroud)

是否可以在解析树访问者中询问“此规则是否跳过了任何空格?”

例如

WS: [ \n\t\r]+ -> skip;
ALPHA: [a-z];
NUMERIC: [0-9];

myrule: (ALPHA | NUMERIC)+;
Run Code Online (Sandbox Code Playgroud)

然后在访问者中(我使用的是 C++):

antlrcpp::Any MyVisitor::visitMyrule(dlParser::MyruleContext *ctx) {
    if (ctx->didSkipSomeWhitespace()) {
        /* There was whitespace */
    } else {
        /* There was no whitespace */
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

所以:

f56fhj => no whitespace
o9f g66ff o => whitespace
Run Code Online (Sandbox Code Playgroud)

我尝试获取标记的开始/停止索引,以便可以将文本长度与进入其中的字符数进行比较,但停止标记并不总是可用,如果是,则值不可用与我期望的索引对齐,并且访问形成令牌的原始输入字符似乎并不简单。

c++ grammar parsing antlr antlr4

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

如何将条件链转换为更快,更简单的代码?

我有9种不同的语法.其中一个将被加载,具体取决于它正在解析的文件的第一行txt.

我正在考虑将词法分析器/解析器派生到sep中.类,然后在我得到匹配时立即实例化它们 - 不确定这是否会减慢我的速度但不会.我想一些基准测试是有序的.

真的,速度绝对是我的目标,但我知道这是丑陋的代码.

现在代码看起来像这样:

sin.mark(0)
site = findsite(txt)
sin.reset()

if ( site == "site1") {
   loadlexer1;
   loadparser1;
} else if (site == "site2") {
   loadlexer2;
   loadparser2;
}
.................
} else if (site == "site8") {
   loadparser8;
   loadparser8;
}

findsite(txt) {
  ...................
  if line.indexOf("site1-identifier") {
    site = site1;
  } else if(line.indexOf("site2-identifier") {
    site = site2;
  } else if(line.indexOf("site3-identifier") {
    site = site3;
  }
  .........................
  } else if(line.indexOf("site8-identifier") {
    site = site8;
  }
}
Run Code Online (Sandbox Code Playgroud)

一些澄清

1)是的,我真的有9个不同的语法,我用antlr构建,所以他们将拥有自己的词法分析器/解析器objs.

2)是的,截至目前我们正在比较字符串,并且显然将用某种整数映射替换.我也考虑过将网站标识符粘贴到一个正则表达式中,但是我不认为这会加快任何速度.

3)是的,这是伪代码所以我不会对这里的语义过于挑剔.. …

java performance parsing dictionary antlr

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

如何lex 0 .. 255?

我想接受0到255之间的十进制数.这是我能想到的最好的:

fragment my_token :
  ('0'..'9') |                    // 0 -> 9
  ('1'..'9' '0'..'9') |           // 0 -> 99
  ('1' '0'..'9' '0'..'9')  |      // 100 -> 199
  ('2' '0'..'4' '0'..'9') |       // 200 -> 249
  ('25' '0'..'5');                // 250 -> 255

但我只是一个无知的n00b.Surelry还有更好的方法吗?

antlr antlr3

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

Java中的ANTLR基本示例

我过去几个小时一直在网上搜索,试图学习一个使用ANTLR的简单例子.但是我很难理解这些例子.是否有任何正文可以在Java中输出:

如果我的意见是 printf("Hello World");

输出应该是:

你好,世界

如果我的意见是

inx = 1;

它应该给出一条错误信息.

我正在尝试使用java创建一个c ++编译器(从词汇开始直到语义部分),我真的想知道我应该做什么.

java compiler-construction antlr

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

Antlr没有显示gui

我在Windows和视觉工作室工作,我的目标是尝试定义语法,以识别我遵循本指南的一些短语的部分 https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Getting+Started+与+ ANTLR + V4

一封信,当我这样做的时候

你好r -gui cmd没有显示任何内容,它没有显示任何类型的错误我怎么能解决这个问题?谢谢你们!!!

PS指南告诉添加antlr-4.5-complete.jar和链接下载antlr-4.2-complete,我试着用这个jar和4.4

c# windows user-interface antlr cmd

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