标签: antlr

如何使用 ANTLRInputStream 从文件中读取输入?

我在网络上尝试了很多示例,但找不到任何有效的示例。

因此,请提供一个如何使用 ANTLRInputStream 从文件中读取输入的工作示例

这样我就可以很容易地理解。

提前致谢。

java antlr antlr4

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

是否可以从antlr4中解析器定义的标签中检索列表?

采取这个虚拟的 antlr4 语法:

grammar testingGrammar;
@header{package gen;}

dsopt_rename: 'rename' (OLDN=ID '=' NEWN=ID)+;
ID: [a-zA-Z_];
Run Code Online (Sandbox Code Playgroud)

我的目标是java。我想得到两个列表:oldNames 和 newNames;可以这样做:

@Override
public DsOption visitDsopt_rename(Dsopt_renameContext ctx) {    
    LinkedList<String> oldNames = new LinkedList<String>();
    LinkedList<String> newNames = new LinkedList<String>();
    for (int i=0; i < ctx.ID().size(); ++i) {
        LinkedList<String> rename = (i%2 == 1) ? oldNames : newNames;
        rename.add(ctx.ID(i).getText());
    }
    return new DsOptRename(oldNames, newNames);
}
Run Code Online (Sandbox Code Playgroud)

我更喜欢以下方法 - 也称为“第二种方法” - (如果它有效的话):

@Override
public DsOption visitDsopt_rename(Dsopt_renameContext ctx) {    
    LinkedList<String> oldNames = new LinkedList<String>();
    LinkedList<String> newNames = new LinkedList<String>();
    ctx.OLDN().forEach(e …
Run Code Online (Sandbox Code Playgroud)

antlr antlr4

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

如何在ANTLR中定义起始规则?

我想从ANTLR python 目标页面执行示例,但我不知道如何定义startRule()-Function 以将代码输入特定规则。有人可以举一个startRule()-Definition 的例子吗?

python antlr

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

强制 ANTLR 在特定文件夹中生成输出文件

我不喜欢将 ANTLR 生成的文件与我的.g4语法和其他版本控制文档放在同一位置。我想将所有生成的文件放在一个单独的嵌套文件夹中,可以通过.gitignore. 到目前为止,我尝试的是<someFolder>在主文件夹内创建一个文件夹,然后从该文件夹内运行:

cd <someFolder>
antlr ../<grammarFile.g4>
Run Code Online (Sandbox Code Playgroud)

但是,它仍然会溢出父文件夹中的所有生成的文件。

PS这应该不重要,但我的环境是 macOS。

antlr antlr4

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

如何使用摩纳哥将自动完成添加到基于浏览器的编辑器

所以最近我想使用自定义语言创建一个基于浏览器的编辑monacoantlr。我遵循了这个很棒的教程https://tomassetti.me/writing-a-browser-based-editor-using-monaco-and-antlr/

Monaco 已经在按 ctrl + space 时给出了建议,但我想在monaco. 我怎样才能做到这一点?

antlr autocomplete editor typescript monaco-editor

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

如何在antlr中找到令牌的长度?

我试图创建一个接受任何字符或数字或几乎任何东西的语法,只要它的长度等于1.

有检查长度的功能吗?

编辑

让我用一个例子更清楚地说明我的问题.我写了以下代码:

grammar first;

tokens {
    SET =   'set';
    VAL =   'val';
    UND =   'und';
    CON =   'con';
    ON  =   'on';
    OFF =   'off';
}

@parser::members {
  private boolean inbounds(Token t, int min, int max) {
    int n = Integer.parseInt(t.getText());
    return n >= min && n <= max;
  }
}

parse   :   SET expr;

expr    :   VAL('u'('e')?)? String |
        UND('e'('r'('l'('i'('n'('e')?)?)?)?)?)? (ON | OFF) |
        CON('n'('e'('c'('t')?)?)?)? oneChar
    ;

CHAR    :   'a'..'z';

DIGIT   :   '0'..'9';

String  :   (CHAR | DIGIT)+; …
Run Code Online (Sandbox Code Playgroud)

antlr

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

所有ANTLR语法都会产生错误"在输入'<EOF>'时没有可行的替代方法"

我需要解析一个小的表达式语言(并且,或者,不是,parens改变优先级)所以选择了ANTLR来完成任务,我取得了很好的进展(ANTLRWorks非常适合新手).我在antlr网站上使用了一些Getting Starting引用,然后找到两篇完全适合我想要完成的内容的博客文章:

http://www.codeproject.com/KB/recipes/sota_expression_evaluator.aspx http://www.alittlemadness.com/2006/06/05/antlr-by-example-part-1-the-language

我遇到的问题是无论我输入什么输入我总是得到错误:

第1:29行输入'EOF'没有可行的选择

因此,作为我的故障排除的一部分,我决定尝试一种我知道很好的语法,并从第一个链接中找到的ECalc.g语法生成一个词法分析器/解析器.令我惊讶的是,在使用该语法时我遇到了同样的错误!我很生气.我对语法的唯一改变是让它生成Java代码并在@members部分中取出一些CSharp代码.

这是我的测试类:

public class ECalcTester {
private final static Logger logger = Logger.getLogger(ECalcTester.class);

public static void main(String[] args) {
    BasicConfigurator.configure();
    ECalcLexer lex = new ECalcLexer(new ANTLRStringStream("false || not (false and true)"));

    Token token;
    while (true) {
        token = lex.nextToken();
        if (token.getType() == Token.EOF) {
            break;
        }

        System.out.println("Token: ‘" + token.getText() + "’");
    }

    CommonTokenStream tokens = new CommonTokenStream(lex);
    lex.nextToken();

    ECalcParser parser = new ECalcParser(tokens);
    try {
        logger.debug(parser.expression().getTree());
    } catch (org.antlr.runtime.RecognitionException e) {
        logger.error("Exception ", …
Run Code Online (Sandbox Code Playgroud)

parsing antlr antlr3

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

用于解析规则的C#产品私有方法的ANTLR

我正在尝试使用ANTLR为使用C#代码生成的简单语言创建解析器.

我已成功地使用名为"rule"的非常简单的规则来生产MyLangLexer.cs和MyLangParser.cs.

问题是生成的方法rule()是私有的.

我想要的是使用ANTLR将字符串解析为AST.

谢谢,Ido.

c# antlr antlr3

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

ANTLR4解析树简化

有没有办法让ANTLR4自动删除生成的解析树中的冗余节点?

更具体地说,我一直在试验GLSL的语法,并且由于规则转发需要自动处理运算符优先级,因此在解析树中最终会出现长线性的"表达式"序列.

大多数生成的树节点只是"转发到下一级优先级",因此不提供任何有用的语法信息 - 您只需要每个序列中的最后一个表达式节点(即规则转发停止的点)或者它成为具有多个子节点的实际树节点的点(即在源中遇到实际表达式)...

我希望有一种简单的方法来消除虚拟中间表达式节点 - 这种类型的结构必须在具有运算符优先级的任何语法中都是通用的.

语法的基本结构是从Khronos语言规范中获得的相当直接的克隆:

https://www.khronos.org/registry/gles/specs/3.1/es_spec_3.1.pdf

antlr antlr4

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

Python + ANTLR4:没有名为antlr4的模块

我想将ANTLR4与Python 2.7结合使用,为此,我做了以下工作:

  1. antlr4-4.6-1使用sudo pacman -S antlr4。将软件包安装在Arch Linux上。

  2. 我写了一个MyGrammar.g4文件,并成功生成了Lexer和Parser Codeantlr4 -Dlanguage=Python2 MyGrammar.g4

  3. 现在执行例如生成的Lexer代码并python2 MyGrammarLexer.py导致错误ImportError: No module named antlr4

可能是什么问题?仅供参考:我同时安装了Python2和Python3-我不知道这是否会造成任何麻烦。

python antlr python-import antlr3 antlr4

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