当前位置: 首页 > 知识库问答 >
问题:

ANTLR4-带有不可区分标记的语言

樊杰
2023-03-14

我正在为一种古老的语言发展语法。

@assign[@var1 (1+3)*2]
@assign[@var2 "foo" $ "bar"]    
@assign[@var2 "foo" $ "bar"]

@assign[var2 "foo" $ "bar"]

@assign
[@var2 "foo" 
$ "bar"]

@assign
[var2 "foo" 
$ "bar"]
@var1 @var2
@assign[@var1 (1+3)*2]
@assign[@var2 "foo" $ "bar"]
@var1 @var2

IS:

8 foobar

以下是我从Mu语法文件开始编写的语法:

grammar Grammar;

////////////////
//   PARSER   //
////////////////

file
 : block EOF
 ;

block
 : stat*
 ;

stat
 : assignment
 | print
 ;

assignment
 : ASSIGN LBRACKET variable expr RBRACKET
 ;

print
 : AT ID
 ;

expr
 : expr CONCAT expr #concatExpr
 | expr MUL expr    #mulExpr
 | expr DIV expr    #divExpr
 | expr ADD expr    #addExpr
 | expr SUB expr    #subExpr
 | atom             #atomExpr
 ;

variable
 : AT ID
 | ID
 ;

atom
 : LPARENS expr RPARENS  #parExpr
 | INT                   #intAtom
 | STRING                #stringAtom
 | variable              #variableAtom
 ;

///////////////
//   LEXER   //
///////////////

ASSIGN : AT 'assign' ;

AT : '@' ;

ID : [a-zA-Z_] [a-zA-Z_0-9]* ;

INT
 : [0-9]+
 ;

LBRACKET : '[' ;
RBRACKET : ']' ;
LPARENS : '(' ;
RPARENS : ')' ;

CONCAT : '$' ;
ADD : '+' ;
SUB : '-' ;
MUL : '*' ;
DIV : '/' ;

WS : [ \t\r\n] -> skip ;

COMMENT : '[*' .*? '*]' -> skip ;

STRING : '"' (~["\r\n] | '""')* '"' ;

为了打印变量,我开发了一个定制的访问者。访问visitPrint方法,我知道有两个令牌:AT和id。

@assign[@var1 "one"]
@assign[var2 "two"]
@assign[var3 var1 $ var2] 
Value of var3 is: @var3
Value of var3 is: onetwo
print
 : AT ID
 | ?????? //Help!
 ;
print
 : AT ID
 | .+?
 ;

提前谢了。

共有1个答案

柳羽
2023-03-14

这看起来类似于Parr的“确定的ANTLR4参考”第12.3章中将XML标记与文本分离的示例。他使用lexer中的模式在XML标记内部和外部(即纯文本)之间切换令牌输出。

在您的例子中,似乎“@assign”和“]”充当标记(模式1),否则您可以在识别变量后将输入打印到输出。

 类似资料:
  • 我是ANTLR的新手,并使用ANTLR4(4.7.2 Jar文件)。我目前正在研究Oracle解析器。我对十进制数字有问题。我只保留了相关的部分。我的语法文件如下。 我该怎么做?我尝试过使用_input.la(-1)!='.'}?等,但对我来说并不正确。我尝试了提到的许多其他步骤(大多数解决方案适用于ANTLR3,但不适用于ANTLR4)。在lexer中有没有一种简单的方法可以做到这一点?我不想编

  • 第三行出现此错误的原因是什么? 打开控制台查看错误

  • 本文向大家介绍SGML(标准通用标记语言)和HTML(超文本标记语言),XML(可扩展标记语言)和HTML的之间有什么关系?相关面试题,主要包含被问及SGML(标准通用标记语言)和HTML(超文本标记语言),XML(可扩展标记语言)和HTML的之间有什么关系?时的应答技巧和注意事项,需要的朋友参考一下

  • 是否可以以某种方式将锚点(或哈希)添加到 Struts 2 操作 URL?具体来说: 我有一个html表单,如果用户单击“添加更多字段”按钮,它可以扩展更多字段。该按钮向后端发送一个html submit(动作“thismyaction”),其中一个列表对象被另一组输入字段填充。然后,操作返回到tile“thisismyform ”,它像以前一样加载相同的jsp,在这里新的字段集是可见的。 (不幸

  • 当你将鼠标悬停在网页的某个区域时,有很多基于JavaScript的库会显示工具提示。有些相当简单,有些允许工具提示显示用CSS样式设计的超文本标记语言内容。 但是有没有一种方法可以在不使用JavaScript的情况下显示样式化的工具提示?如果您只是使用属性,标记不会被处理(例如

  • 我正在使用GitHub提供的antlr4语法分析器和词法分析器来解析Python3中的PHP。 当我直接使用这些语法时,我的PoC代码工作: antlr试验。py 这给出了输出 当我使用以下PHP时。g4语法,我犯了很多错误: 在对pythons导入交换评论之后,我得到了这个错误 然而,当我在语法上运行antlr4工具时,我没有出错。我在这里被难住了——是什么导致了这个问题?