标签: antlr

使用ANTLR3将换行符,EOF解析为语句结尾标记

我的问题是关于在ANTLRWorks中运行以下语法:

INT :('0'..'9')+;
SEMICOLON: ';';
NEWLINE: ('\r\n'|'\n'|'\r');
STMTEND: (SEMICOLON (NEWLINE)*|NEWLINE+);

statement
    : STMTEND
    | INT STMTEND
    ;

program: statement+;
Run Code Online (Sandbox Code Playgroud)

无论选择哪个换行NL(CR / LF / CRLF)或整数,我都可以通过以下输入(以程序作为开始规则)获得以下结果:

“; NL ”或“ 32; NL ”解析没有错误。“;” 或“ 45;” (不包含换行符)将导致EarlyExitException。“ NL ”本身解析没有错误。不带分号的“ 456 NL ”会导致MismatchedTokenException。

我想要的是一个语句以换行符,分号或分号后接换行符来终止,并且我希望解析器在终止符上尽可能多地吃掉连续的换行符,因此“; NL NL NL NL ”只是一个终端,而不是四个或五个。另外,我希望文件结尾的情况也可以是有效的终止,但是我还不知道该怎么做。

那么,这有什么问题,如何使它在EOF终止呢?我对解析,ANTLR和EBNF完全陌生,并且在简单的计算器示例和参考之间的某个水平上,我没有发现太多要阅读的资料(我有The Definitive ANTLR Reference,但它确实一个参考,前面有一个快速入门,我还没有在ANTLRWorks之外运行过,所以任何阅读建议(除了Wirth的1977 ACM论文)也将有所帮助。谢谢!

antlr antlrworks antlr3

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

解释Jint如何工作

我想了解Jint是一个用C#编写的JavaScript Intrepreter是如何工作的.特别:

  1. 它如何利用Antlr?
  2. 哪些部分,如果有的话,或者这个项目是新颖的,哪些部分代表现有JS Intrepreter到C#.NET的端口?
  3. 一般来说,如何在C#中编写Javascript Intrepreter?例如,在技术和代码方面已有什么,你需要自己编写什么?
  4. 编写JS解释器最具挑战性的部分是什么?

javascript c# interpreter antlr jint

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

ANTLR - 允许关键字之间的任何字符

我想为一种简单的语言定义语法.

该语言允许某种分配.

keyworda: this is the 1 keyword-A
keywordb: this is the second keywordb
...
Run Code Online (Sandbox Code Playgroud)

问题是,在关键字和':'任何char之后应该是可能的(关键字也是)

我尝试过很多东西,但我认为我仍然没有进入词法分析器和解析器思考...

我最后的想法失败了:

rule 
  :  'keyworda' ':' anychar* 'keywordb' ':' anychar* EOF 
  ;

anychar
  :  .
  ;

NEWLINE
  :  ('\r'? '\n') {$channel=HIDDEN;}
  ;
Run Code Online (Sandbox Code Playgroud)

编辑

首先:谢谢你的回答!

我通读了手册并查看了scott stanchfield的教程.

问题是,我没有得到"anychar"的东西!

你是对的,我上面提到的语法错了,因为我很着急.

这是一个更好的尝试.问题仍然是,Tokenizer在定义ala中识别例如keyworda

keyworda : this is keyworda.
keywordb : this is another key!
...
Run Code Online (Sandbox Code Playgroud)

语法:

rule
    :   KEYA ':' STRING_LITERAL* NEWLINE
        keybdefinition*
         EOF
    ;

keybdefinition
    :   KEYB ':' STRING_LITERAL* NEWLINE
    ;


KEYA: 'keyworda';
KEYB:'keywordb'; …
Run Code Online (Sandbox Code Playgroud)

antlr keyword antlrv3ide

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

Antlr错误:以下令牌定义永远不能匹配,因为先前的令牌匹配相同的输入

我用antlr扭曲一个简单的语言,我在AntlrWorks中定义了一个Lexer语法,但是当我想生成java代码时,它给了我错误:

Antlr错误:以下令牌定义永远不能匹配,因为先前的令牌匹配相同的输入:FLOAT_OR_INT,OPEN_PAR,CLOSE_PAR,....(几乎适用于所有规则!)

我是antlr的新手,我认为这是因为规则位置的顺序,但我不知道他们应该怎么做,我的错误是什么?

这是语法:

lexer grammar OurCompiler;
options
{
    k=5;

} 


ID                      : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
                        ;



protected
INT                     : ('0'..'9')+
                        ;

protected
FLOAT                   : INT '.' INT
                        ;


FLOAT_OR_INT            : ( INT '.' ) => FLOAT { $setType(FLOAT); }
                        | INT { $setType(INT); }
                        ;       


OPENPAR_OR_OUTPUT_OPERATOR  :   '(' { $setType(OPEN_PAR); } | '(' '(' { $setType(OUTPUT_OPERATOR); }
                            ;

CLOSEPAR_OR_INPUT_OPERATOR  :   ')' { $setType(CLOSE_PAR); } | ')' ')' { $setType(INPUT_OPERATOR); }
                            ;

protected   
OPEN_PAR                :  '('  ;

protected
CLOSE_PAR               :  ')' …
Run Code Online (Sandbox Code Playgroud)

antlr

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

ANTLR的Java Tree解析器输出

我在ANTLR网站上找到了一个样本模板,它的Javatreeparser.g,该网站说它可以产生我需要的AST,但由于我是ANTLR的新手,我该如何让它显示?到目前为止我所做的是将语法文件与我现有的java语法放在一起.但我不知道如何从文件中使用和输出我需要的AST.我该怎么做?

java tree antlr abstract-syntax-tree

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

定义以任何顺序接受参数的规则

我的规则是:

interfaceCommands
    :   descriptionCmd
        ipAddressCmd
        otherCmd
    ;
Run Code Online (Sandbox Code Playgroud)

虽然预期的顺序Cmds如语法中所述,但我也应该能够在这些顺序Cmds互换时接受输入.例如,在任何时候,ipAddressCmd可以在实际输入之前descriptionCmd或之后otherCmd.我的语法应如何修改以适应并能够解析这些无序输入?

antlr antlr4

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

令牌识别错误:antlr

我有一个ANTLR 4语法:

grammar Test;

start : NonZeroDigit '.' Digit Digit? EOF
      ;

DOT            :    '.'  ;
PLUS           :    '+'  ;
MINUS          :    '-'  ;
COLON          :    ':'  ;
COMMA          :    ','  ;
QUOTE          :    '\"' ;
EQUALS         :    '='  ;
SEMICOLON      :    ';'  ;
UNDERLINE      :    '_'  ;
BACKSLASH      :    '\\' ;
SINGLEQUOTE    :    '\'' ;

RESULT_TYPE_NONE          :    'NONE'       ;
RESULT_TYPE_RESULT        :    'RESULT'     ;
RESULT_TYPE_RESULT_SET    :    'RESULT_SET' ;

TYPE_INT       :    'Int'    ;
TYPE_LONG      :    'Long'   ;
TYPE_BOOL      :    'Bool'   ; …
Run Code Online (Sandbox Code Playgroud)

grammar antlr lexer antlr4 antlrworks2

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

编译时ANTLRWorks TestRig卡住了

我最近开始使用ANTLR并发现了ANTLRWorks IDE.虽然编辑器工作正常,但是,当我运行测试装置时,它似乎停留在编译语法文件(或者更确切地说是编译语法没有做什么?),无论我给它什么输入.这是我得到的输出:

ANTLR Codegen

参数:[ - o,C:\ Users \\ AppData\Local\Temp\TestRigTask-1395567588803,-lib,C:\ Users \\ Desktop,-no-listener,-no-visitor,C:\ Users \\ Desktop\Test.g4]

ANTLR Testrig

编译语法文件......

以下是我给它测试问题的输入:

语法

grammar Test;

CUP : 'cup';
MUG : 'mug';
TEA : 'tea';
COFFE: 'coffe';

drinker : 'drinking a' holder 'of' liquid;
holder : MUG | CUP;
liquid : TEA | COFFE;
Run Code Online (Sandbox Code Playgroud)

测试文件

drinking a mug of coffe
Run Code Online (Sandbox Code Playgroud)

我做错了什么/错过了重要的事情吗?

grammar code-generation antlr antlrworks

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

'a-zA-Z'对我来说是一个完全的惊喜,同时匹配替代品

我有问题用antlr v4生成我的语法定义:

grammar TagExpression;

expr : not expr
| expr and expr
| expr or expr
| '(' expr ')'
| tag
;

tag : [a-zA-Z]+ ;

and : '&' ;

or : '|' ;

not : '!' ;

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

语法错误发生在这里: tag : [a-zA-Z]+ ;

error(50): c:\temp\antlr\TagExpression.g4:10:6: syntax error: 'a-zA-Z' came as a complete surprise to me while matching alternative
Run Code Online (Sandbox Code Playgroud)

我看到的例子有非常相似的结构.知道为什么会这样吗?

谢谢

grammar antlr antlr4

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

如何在Eclipse中使用antlr4?

由于Antlr4是Antlr的新版本,这是我第一次使用它.我从eclipse市场下载了Antlr4插件.我制作了新的ANTLR 4项目,我得到了Hello.g4

后来我看到了这个小语法:

  /**
  * Define a grammar called Hello
   */
   grammar Hello;
     r  : 'hello' ID ;         // match keyword hello followed by an                                                          identifier

      ID : [a-z]+ ;             // match lower-case identifiers

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

一旦它被保存,它是构建,我从Antlr控制台看到它,我想测试程序,但我不知道如何,我不知道如何制作一个可以由新编译的新文件语法?

在此先感谢您的帮助.

eclipse antlr antlr4

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