我使用的是Antlr 4.7.2。我试图实现一个“If Else”语句:
主要问题是ParseTree中没有包含可选规则,因此我认为我没有得到可选规则的语法错误。
我现在的语法定义是:
prog : stat+ ;
stat : func_declaration #rFuncDeclStat
| if_stat #rIfStat
| while_stat #rWhileStat
| for_stat #rForStat
| 'return' expr? STAT_END #rReturnStat
| LET ID ('=' expr)? STAT_END #rVarDeclStat
| var_reference '=' expr STAT_END #rAssignStat
| print_stat #rPrintStat
| expr STAT_END #rFuncCallStat
;
block_stat : '{' stat* '}' ;
if_stat : if '(' expr ')' (stat | block_stat) else_stat?;
else_stat : ELSE (stat | block_stat) ;
if (2==2){
let a = 4;
}
else{
let b = 5; //var declaration
}
if (2==2){
let a = 4;
}
else{
let b = 5;
通常,如果输入流包含的输入比您调用的规则所需的多,则不是语法错误。附加的输入只是留在流中。例如,这允许您在循环中调用规则。
因此,如果对输入if(2==2){let a=4;}else{let b=5;
调用prog
规则,则if(2==2){let a=4;}
部分将被解析为不包含else的if-语句,并且else{let b=5;
将保留在输入缓冲区中。
因为这不是您想要的,所以应该在prog
规则的末尾添加EOF
:
prog : stat+ EOF;
我的语法允许以下操作: 我从其他语法中抓了几个东西来玩。我的主要问题是我的expr规则。给定以下输入:,我期望解析树会找到..规则,但它将解释0。并不正确解析其余部分。 如果在我的0后面加上一个空格,就可以了: 谢了!
问题内容: 我已经为此奋斗了2天,尽我所能用Google搜索和stackoverflow,但是我无法解决。 我正在构建一个简单的节点应用程序(+ Express + Mongoose),其登录页面重定向到主页。这是我的服务器JS代码: 登录页面向发出POST请求,在此验证发布的数据。这可行。我可以在Node控制台中看到“我们在这里:’/ credentials’”。 然后是问题:res.redir
我刚刚开始学习ANTLR4 lexer规则。我的目标是为Java属性文件创建一个简单的语法。以下是我目前掌握的信息:
问题内容: 当使用带点名的名称时,例如:,返回的模块不是,返回的内容几乎都是空的!这里发生了什么? 问题答案: 从python文档上: … 当name变量的形式为package.module时,通常返回顶级包(名称直到第一个点),而不是按名称命名的模块。但是,当给出非空的fromlist参数时,将返回按名称命名的模块。这样做是为了与为不同种类的import语句生成的字节码兼容。使用“ import
问题内容: 根据JavaDoc for ,该函数在比较期间不考虑比例。 现在,我有一个测试用例,看起来像这样: 我希望函数返回的值是10,小数位数为10。打印该值可显示预期的结果。但是该功能似乎并未按照我认为的方式工作。 这里发生了什么? 问题答案: 并 没有 代表0.7。 它代表0.69999999999999999999555910790149937383830547332763671875(
问题内容: 我是否错过了明显痛苦的事情?还是世界上没有人真正使用java.util.BitSet? 以下测试失败: 我真的不清楚,为什么我没有得到长度为2的BitSet和值为10的结果。我偷看了java.util.BitSet的源代码,并且在随意检查时似乎无法对两者进行足够的区分。设置为false且从未设置为任何值… (请注意,在构造函数中显式设置BitSet的大小无效,例如: 问题答案: 人们确