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

ANTLR4:两个通道,一个用于CSV格式的数据,一个用于键/值格式的数据--不工作

丌官招
2023-03-14

下面的lexer语法包含两组规则:(1)标记CSV格式输入的规则,以及(2)标记键/值格式输入的规则。对于(1),我将令牌放在通道(0)上。对于(2),我将令牌放在通道(1)上。你看到我的词法语法有什么问题吗?

下面还有一个解析器语法,它还包含两组规则:(1)将CSV标记构造为解析树的规则,以及(2)将键/值标记构造为解析树的规则。你看到我的解析器语法有什么问题吗?

当我将ANTLR应用于语法文件时,使用以下CSV输入编译并运行测试装备(带有-gui标志):

FirstName, LastName, Street, City, State, ZipCode
Mark,, 4460 Stuart Street, Marion Center, PA, 15759

解析树完全错误-树不包含任何数据。我不知道为什么解析树是错误的。有什么建议吗?我分别测试了每个部分(从lexer和parser语法中删除了键/值规则,并使用CSV输入运行它,从lexer和parser语法中删除了CSV规则,并使用键/值输入运行它),它工作得很好。

Lexer语法

lexer grammar MyLexer;      

COMMA  : ','            -> channel(0) ;
NL     : ('\r')?'\n'    -> channel(0) ;
WS     : [ \t\r\n]+     -> skip, channel(0) ;
STRING : (~[,\r\n])+     -> channel(0) ;            

KEY       : ('FirstName' | 'LastName')  -> channel(1) ;
EQ        : '='                         -> channel(1) ;
NL2       : ('\r')?'\n'                 -> channel(1) ;
WS2       : [ \t\r\n]+                  -> skip, channel(1) ;
VALUE     : (~[=\r\n])+                  -> channel(1) ;

解析器语法

parser grammar MyParser;                

options { tokenVocab=MyLexer; }         

csv       : (header rows)+ EOF ;
header    : field (COMMA field)* NL ;
rows      : (row)* ;    
row       : field (COMMA field)* NL ;
field     : STRING | ;

keyValue  : pairs EOF ;
pairs     : (pair)+ ;
pair      : key EQ value NL2;
key       : KEY ;
value     : VALUE ; 

共有1个答案

胡意致
2023-03-14

最长的令牌比赛获胜,如果两场比赛大小相等,则第一场比赛获胜。这意味着:

字符串包含键、EQ和值,您将永远无法获得后一种类型的令牌。

ANTLR解析器需要对令牌流进行随机访问,因此不允许上下文相关的词法分析。

我建议将两个lexer语法放在单独的语法中。也许将它们与公共解析器语法一起使用会变得很棘手。如果是这样的话,还可以拆分解析器语法。

 类似资料:
  • 我有两个数据格式不同但值相同的表。 表一: 表二: 表1和表2之间的关系是多对一。此表的值与上面的日期格式相同。我现在的任务是映射这些表。我如何在ERD图中显示这些。我必须创建一个新表吗?

  • 我相信这很简单,但找不到答案。我有一个数据帧df: 然后,我有另一个较小的数据框,其中包含单元格引用(行号和列号),引用df中应为空的特定单元格(即NA): 我如何用NA替换df中所有由cellRefs中的行和列引用引用的单元格?

  • 问题内容: 如何在C#中格式化DateTime.Now的字符串结果以插入到DATETIME类型的MySQL数据库表列中? 我尝试了以下操作,但未成功: 问题答案: 不要在查询中添加文字日期,而应使用参数。这样,您不必担心格式。用户输入的字符串也更安全,因为它可以防止SQL注入。

  • 问题内容: 我有两个数据框,第一个有1000行,看起来像: 该列具有不同的值,有时会重复,但通常大约有50个唯一值。 第二个数据框包含所有这50个唯一值(50行)以及与这些值关联的酒店: 我的目标是用第二个数据帧的列的相应值替换第一个数据帧的列中的值,或者用相应的值创建该列。当我尝试通过像 我有一个错误,即数据帧的大小不相等,因此无法进行比较 问题答案: 如果将索引设置为另一个df上的“组”列,则

  • 我试图在包含重复索引的两个数据帧上使用pandas concat。 当我尝试连接我的两个数据帧时,我得到以下错误 传递值的形状是(12, 180054),指数暗示(12,10000)。 为了更好地理解这个问题,我创建了两个数据帧: 看起来像: 和 看起来像: 这与我的原始数据帧也有类似的方面。索引是重复的,并且是日期时间格式。 但是,concat(axis=1)可以很好地创建以下数据帧 (这正是我

  • 我有两个数据帧df1和df2 df1如下 df2就像 我想根据df2中与df1中的列名匹配的单元格值将值从df1复制到df2,所以我的df3应该看起来像 df3 基本上,我想根据df2的单元格值(df1中的列名)从df1复制df2中的列 如果它仍然令人困惑,请告诉我