标签: antlr3

如何解决这种模棱两可的语法?

我写过这个语法:

expr        : multExpr ( ('+' | '-') multExpr )*;
multExpr    : atom ( ('*' | '/') atom )*;
atom    : INT | FLOAT | ID | '(' expr ')';
condition   : cond ('or' cond)*;
cond    : c1 ('and' c1)*;
c1      : ('not')? c2;
c2      : '(' condition ')' | boolean;
boolean : expr (relop expr | ²) | 'true' | 'false';
relop   : '<' | '<=' | '>' | '>=' | '==' | '!=';
Run Code Online (Sandbox Code Playgroud)

我已经省略了INT,FLOAT,ID的词法规则,因为很明显.

问题是c2规则,它是模棱两可的,因为'(',我找不到解决方案,你能给我一个解决方案吗?

antlr antlrworks antlr3

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

如何删除ANTLR3警告'多个替代品'

我在堆栈溢出中找到了与"多个替代"相关的问题,但没有什么有用的.这是我在antlr3中的g文件的一部分.

statement:
    selection_stmt
    | expression_stmt 
    | compound_stmt
    | iteration_stmt
    | return_stmt
    ;

selection_stmt:
    IF OPENB expression CLOSB statement (ELSE statement)?
    ;

expression:
    (var ASSIGN expression) => assignment 
    | simple_expression
    ;
Run Code Online (Sandbox Code Playgroud)

我面临的问题是我收到上述短语的警告ELSE statement.

(200):决策可以使用多个备选方案匹配输入,例如"ELSE":1,2结果,对于该输入禁用了备选方案2

谁能解释一下这里发生了什么?谢谢.

PS当我使用句法谓词时((ELSE)=>ELSE statement)?,警告消失.我也不明白这个原因.

grammar antlr context-free-grammar antlr3

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

句法谓词 - 从 Antlr 3 升级到 Antlr 4

我有语法谓词,我必须转换为 Antlr 4。语法不是我自己写的,所以我不知道如何以有意义的方式转换它们。这些是我必须转换的语法的主要变体。

1.

    simpleSelector
    : elementName 
        ((esPred)=>elementSubsequent)*

    | ((esPred)=>elementSubsequent)+
    ;

    esPred
    : HASH | DOT | LBRACKET | COLON
    ;

    elementSubsequent
    : HASH
    | cssClass
    | attrib
    | pseudo
    ;
Run Code Online (Sandbox Code Playgroud)

2.

        fragment    EMS         :;  // 'em'
        fragment    EXS         :;  // 'ex'
        fragment    LENGTH      :;  // 'px'. 'cm', 'mm', 'in'. 'pt', 'pc'
        fragment    ANGLE       :;  // 'deg', 'rad', 'grad'
        fragment    TIME        :;  // 'ms', 's'
        fragment    FREQ        :;  // 'khz', 'hz'
        fragment    DIMENSION   :;  // nnn'Somethingnotyetinvented'
        fragment    PERCENTAGE  :;  // …
Run Code Online (Sandbox Code Playgroud)

antlr3 antlr4

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

ANTLR netbeans config无法找到或加载主类org.antlr.Tool

我尝试使用build xml配置antlr和netbeans,我遵循http://wiki.netbeans.org/AntlrInNetBeansJavaApplication 教程,但是当我清理并构建项目时,我得到一个错误,如

错误:无法找到或加载主类org.antlr.Tool

我设置了类路径:SET CLASSPATH =.; c:\ Users\BayDebrecen\Downloads\antlr-4.2.2-complete.jar;%CLASSPATH%

我的构建xml:

<?xml version="1.0" encoding="UTF-8"?>
Run Code Online (Sandbox Code Playgroud)

构建,测试和运行项目MyAntlrProject.

<target name="-pre-compile" depends="antlr">
</target>

<target name="init-antlr">
    <!-- Full path to Antlr jar -->
    <property name="antlr.jar" location="c:\\Users\\BayDebrecen\\Downloads\\antlr-4.2-complete.jar"/>
    <!-- Grammar path -->
    <property name="antlr.grammar" location="src\\myantlrproject\\MyGrammar.g"/>
</target>

<target name="antlr" depends="init-antlr" unless="up-to-date">
    <!-- Compiling grammar -->
    <java classname="org.antlr.Tool"  fork="true">
        <arg value="${antlr.grammar}"/>
        <classpath path="${antlr.jar}"/>
    </java>        
</target>
Run Code Online (Sandbox Code Playgroud)

如何正确编译和运行我生成的类?

netbeans antlr netbeans-plugins antlr3 antlr4

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

在评估不符合我的语法定义的字符串时,ANTLR不报告错误

这是我第一次与ANTLR合作在伦敦帝国理工学院开展项目,直到现在它才非常有用.我已经定义了一个简单的递归语法如下

grammar Hello;      

execution: workflow;

workflow : Task 
         | workflow OPERATOR workflow 
         |'(' workflow OPERATOR workflow ')'                        
         |'(' workflow OPERATOR workflow ')' (OPERATOR workflow)*                        
          ;


Task : 'T' ('0'..'9')+ | 'WF' ('0'..'9')+;

OPERATOR: 'AND' | 'OR'  | 'XOR' |';' ;

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

评估字符串,如:

T6 ; (T4 AND T7) ; T5 ; ( (WF23 OR WF2) OR (T3 AND WF4) AND T4) AND T5 OR T11
Run Code Online (Sandbox Code Playgroud)

并且它完美地运行,当我尝试评估不正确的字符串时,我的问题就出现了

T6 ; (T4 AND T7) ; T5 ; ( …
Run Code Online (Sandbox Code Playgroud)

antlr antlrworks antlr3 antlrv3ide antlr4

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

从 anlr3 转换为 antlr 4

因为我是 antlr 的新手,所以我在语法谓词方面有很多问题。我一直在尝试转换这个语法,它是整洁语法的一部分,以便用 antlr4 解析它,我真的很困惑如何以有意义的方式改变它。

date_time
 : (
      (date)=>date (date_time_separator explicit_time)?
      | explicit_time (time_date_separator date)?
    ) -> ^(DATE_TIME date? explicit_time?)
  | relative_time -> ^(DATE_TIME relative_time?)
  ;`
Run Code Online (Sandbox Code Playgroud)

antlr3 natty antlr4

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

以点文件的形式生成 AST

我正在使用 ANTLR4 生成 java 源代码的 AST,但我不得不转向 ANTLR3,因为我没有得到太多帮助和文档,而且确实很难继续。我设法生成 AST,但不是以可视格式生成。然后我遇到了一个很棒的答案 ,我确实能够在 DOT 文件中生成 AST,但有一个小问题。

我的代码:

import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.ANTLRFileStream;
import org.antlr.runtime.tree.CommonTree;
import org.antlr.runtime.tree.DOTTreeGenerator;
import org.antlr.stringtemplate.StringTemplate;

class Main {

        public static void main(String[] args) throws Exception {
            parseFile("/home/satnam-sandhu/Workstation/ASTGenerator/resource/java/Blabla.java");
        }

    public static void parseFile(String f)throws Exception {

            JavaLexer lexer = new JavaLexer(new ANTLRFileStream(f));
            CommonTokenStream tokens = new CommonTokenStream(lexer);
            JavaParser parser = new JavaParser(tokens);
            CommonTree tree = (CommonTree)parser.compilationUnit().getTree();
            DOTTreeGenerator gen = new DOTTreeGenerator();
            StringTemplate st = gen.toDOT(tree);
            System.out.println(st);

    }

}
Run Code Online (Sandbox Code Playgroud)

我正在使用 gradle,所以我通过以下方式构建项目:

gradle clean …
Run Code Online (Sandbox Code Playgroud)

java dot abstract-syntax-tree antlr3

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

ANTLR 嵌套函数

ANTLR 适合这个项目吗?

\n\n

我正在寻找处理和转换用户输入的字符串,其中可能包含自定义函数。例如,用户可能会在字符串中写入类似 $CAPITALIZE('word') 的内容,而我想使用 StringUtils 在后台执行\n实际转换。

\n\n

我想用户有时会编写嵌套函数,例如:

\n\n

$RIGHT_PAD($RIGHT($CAPITALIZE('a123456789'),6),3,'0')

\n\n

其中预期输出为字符串值“A12345000”。

\n\n

我尝试使用正则表达式将函数分开,但一旦嵌套,就不那么容易了。我想我可以尝试编写自己的解析器,在进行研究时我发现了一篇建议使用 ANTLR 的文章。

\n\n

ANTLR 适合这样做吗?如果是这样,是否有任何类似的示例可供我查看?或者有人可以给我一个例子,说明如何在 ANTLR 中编写此代码,以便我可以拥有可以单独处理和以嵌套方式处理的自定义函数。

\n\n

功能:

\n\n
    \n
  • $CAPITALIZE(字符串 str)
  • \n
  • $INDEX_OF(字符串序列,字符串搜索序列)
  • \n
  • $LEFT(字符串 str, int len)
  • \n
  • $LEFT_PAD(字符串 str, int 大小,字符 padChar)
  • \n
  • $LOWERCASE(字符串 str)
  • \n
  • $RIGHT(字符串 str, int len)
  • \n
  • $RIGHT_PAD(字符串 str, int 大小, 字符 padChar)
  • \n
  • $STRIP(字符串 str)
  • \n
  • $STRIP_ACCENTS(字符串输入)
  • \n
  • $SUBSTRING(字符串 str, int 开始)
  • \n
  • $SUBSTRING(字符串 str, int 开始, int 结束)
  • \n
  • $TRIM(字符串 str)
  • \n
  • $TRUNCATE(字符串 str, …

java antlr3 antlr4

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

Antlr 3.2重写规则

我最近开始学习Antlr并下载AntlrWorks 1.4,据说包括Antlr 3.2.现在,3.2应该支持像' - >'这样的重写规则语法,但是我甚至无法得到基于Lexer或Parser规则构建的最简单的情况:

grammar TestRewrite;

ab  :   a b -> a;

a   :   A;
b   :   B;

A   :   'a';
B   :   'b';
Run Code Online (Sandbox Code Playgroud)

当我尝试编译它时,我收到错误:

[11:26:29] error(100): TestRewrite.g:3:13: syntax error: antlr: TestRewrite.g:3:13: unexpected token: a
Run Code Online (Sandbox Code Playgroud)

为什么是这样.结构看起来很简单:ab应该生成一棵树,其中只捕获一个节点.不是你怎么做的?我无法使用rooting('^')或忽略('!').我很困惑.

antlr antlrworks antlr3

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

如何解决ANTLR不匹配输入的问题

鉴于语法

test    : 'test' ID '\n' 'begin' '\n'  'end' '\n' -> ^(TEST ID);

ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
    ;
Run Code Online (Sandbox Code Playgroud)

和测试字符串

"test blah\n begin\n end\n"
Run Code Online (Sandbox Code Playgroud)

导致

line 1:0 mismatched input 'test blah\\n begin\\n end\\n' expecting 'test'
<mismatched token: [@0,0:21='test blah\\n begin\\n end\\n',<12>,1:0], resync=test blah
 begin
 end
>
Run Code Online (Sandbox Code Playgroud)

这里出了什么问题?

antlr antlr3

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