c# – 语法识别彼此旁边的无限'{‘expr’}’
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 语法识别彼此旁边的无限'{‘expr’}’,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2501字,纯文字阅读大概需要4分钟。
内容图文
我正在使用ANTLR4编写一个C#应用程序来识别以下TeX‘样式:
{a}{x}+{b}{y}+{c}
我当前的语法总是采用'{‘expr’}’的最后一个实例,然后忽略字符串的开头.以下是当前语法的一些输出结果(如下所述):
>输入:{a}输出:a [通过]
>输入:{a} {x}输出:a x [通过]
>输入:{a} {x}输出:x [失败]所需:ax
>输入:{a} {x} {b}输出:x b [失败]所需:ax b
>输入:{a} {x} {b} {y}输出:y [失败]所需:ax by
>输入:{a} {x} {b} {y} {c}输出:y c [失败]所需:ax by c
>输入:{a} {x} {b} {y} {c} {d}输出:d [失败]所需:ax by cd
有想法该怎么解决这个吗?
语法MyGra.g4文件:
/*
* Parser Rules
*/
prog: expr+ ;
expr : '{' expr '}' # CB_Expr
| expr op=('+'|'-') expr # AddSub
| '{' ID '}' # CB_ID
| ID # ID
;
/*
* Lexer Rules
*/
ID: ('a' .. 'z' | 'A' .. 'Z')+;
ADD : '+';
SUB : '-';
WS: (' ' | '\r' | '\n') -> channel(HIDDEN);
MyGraVisitor.CS文件:
public override string VisitID(MyGraParser.IDContext context)
{
return context.ID().GetText();
}
public override string VisitAddSub(MyGraParser.AddSubContext context)
{
if (context.op.Type == MyGraParser.ADD)
{
return Visit(context.expr(0)) + " + " + Visit(context.expr(1));
}
else
{
return Visit(context.expr(0)) + " - " + Visit(context.expr(1));
}
}
public override string VisitCB_Expr(MyGraParser.CB_ExprContext context)
{
return Visit(context.expr());
}
public override string VisitCB_ID(MyGraParser.CB_IDContext context)
{
return context.ID().GetText();
}
更新#1:
有人建议包括语法规则
'{' expr '}{' expr '}'
但是,如果我有{a} {b} {c} {d} {e} {f} {g},我认为语法应该通过解析树来解释“本身”的递归版本……那么如果我彼此相邻有1000个{expr}?那我需要多少规则?我认为该建议是有效的,但我不知道如何在彼此旁边占用无限量的{expr}?
我的另一个问题是:如何重用规则CB_Expr?
更新#2:
我添加了规则:
| expr CB_Expr # CB_Expr2
与访客:
public override string VisitCB_Expr2(MyGra.CB_Expr2Context context)
{
return Visit(context.expr()) + Visit(context.CB_Expr());
}
这没有帮助,我仍然得到所有情况相同的输出(如上所述).
解决方法:
你的语法很暧昧.例如:输入{x}可以有两个不同的解析树(正如Mephy所说):
(CB_Expr { (expr (ID x)) })
和
(DB_ID {x})
删除CB_ID将解决此问题,而不会实际做任何负面的事情.
对于你的实际问题,这应该是expr的技巧:
expr : left=id_expr op=('+' |'-') right=expr #AddSub
| id_expr #ID_Expr
;
id_expr :
| '{' ID '}' id_expr #ID_Ex
| '{' ID '}' #ID
;
我没有测试过这个,我没有写过任何访客,但语法应该有效.
id_expr规则以递归方式工作,因此您应该能够根据需要在彼此之后放置尽可能多的{ID} – 至少有一个,即语法现在的方式.
内容总结
以上是互联网集市为您收集整理的c# – 语法识别彼此旁边的无限'{‘expr’}’全部内容,希望文章能够帮你解决c# – 语法识别彼此旁边的无限'{‘expr’}’所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。