C# Antlr4未检测到1到8之间的整数,lexer问题
antlr 4 c#存在一个无法识别整数标记的问题。它适用于数字1和9,但不适用于1到9 我试着重建语法,但不起作用:( 这是我的语法:C# Antlr4未检测到1到8之间的整数,lexer问题,c#,antlr4,C#,Antlr4,antlr 4 c#存在一个无法识别整数标记的问题。它适用于数字1和9,但不适用于1到9 我试着重建语法,但不起作用:( 这是我的语法: grammar simplerlang; // Parser program : statement+ ; statement : let | print ; let : VAR '=' INT ; print : 'print' (INT | VAR) ; // Lexer VAR : [a-z]+ ; INT : [0–9]
grammar simplerlang;
// Parser
program : statement+ ;
statement : let | print ;
let : VAR '=' INT ;
print : 'print' (INT | VAR) ;
// Lexer
VAR : [a-z]+ ;
INT : [0–9]+ ;
WS : [ \n\t]+ -> skip;
这是我的c代码:
使用系统;
使用System.Collections.Generic;
使用Antlr4.Runtime;
使用Antlr4.Runtime.Tree;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
名称空间超级简单
{
班级计划
{
静态字典变量映射=新字典();
静态void Main(字符串[]参数)
{
while(true)
{
控制台。写(“>”;
字符串_in=Console.ReadLine();
AntlInputStream输入=新的AntlInputStream(_in);
SimpleLangleXer lexer=新的SimpleLangleXer(输入);
CommonTokenStream令牌=新的CommonTokenStream(lexer);
SimpleLangParser解析器=新的SimpleLangParser(令牌);
IParseTree树=parser.statement();
ParseTreeWalker=新的ParseTreeWalker();
Walk(新的simplerlangCustomListener(),树);
}
}
类SimpleLangCustomListener:SimpleLangBaseListener
{
公共覆盖无效ExitPrint(SimpleLangParser.PrintContext ctx)
{
如果(ctx.INT()!=null)
{
Console.WriteLine(ctx.INT().GetText());
}
else if(ctx.VAR()!=null)
{
WriteLine(variableMap[ctx.VAR().GetText()]);
}
}
public override void ExitLet(simplelangparser.LetContext ctx)
{
variableMap.Add(ctx.VAR().GetText(),
int.Parse(ctx.int().GetText());
}
}
}
}
输入:打印1
输出:
第1行:6“1”处的令牌识别错误
第1行:7在“”处缺少{VAR,INT}
输入:打印0
输出:0
输入:打印9
输出:9
VAR : [a-z]+ ;
INT : [0–9]+ ;
如果仔细观察这两行,您会注意到0和9之间的破折号比a和z之间的破折号长。这意味着这不是常规破折号,而是Unicode破折号(或类似的东西)
因此,ANTLR不将其识别为范围,而是将其识别为匹配0、9或emdash的字符类
如果仔细观察这两行,您会注意到0和9之间的破折号比a和z之间的破折号长。这意味着这不是常规破折号,而是Unicode破折号(或类似的东西)
因此,ANTLR不将其识别为范围,而是将其识别为匹配0、9或emdash的字符类
VAR : [a-z]+ ;
INT : [0–9]+ ;