如何为非 lambda-free 语言创建 ANTLR 语法?

发布于 2025-01-17 02:47:15 字数 1799 浏览 3 评论 0原文


我试图使用 ANTLR v4.9.3 模仿下面显示的语法 G ...

< a href="https://i.sstatic.net/vpAid.png" rel="nofollow noreferrer">输入图像描述这里

我的尝试如下所示...

grammar G ;
s : t s | ;
t : 'aaa' t 'bbb' |  ;

我按如下方式调用 ANTLR 工具...

org.antlr.v4.Tool G.g4

该工具的响应是...

The following sets of rules are mutually left-recursive [s]

我的问题是...

如何为语法 G 创建 ANTLR 语法?


为了消除错误,语法G已更新为...

grammar G ;
s : t* EOF ;
t : 'aaa' 'bbb' | 'aaa' t 'bbb' ;

我还尝试以编程方式区分L(G)中的字符串>,以及不在 L(G) 中的字符串(其中 L(G) 是语法 G 生成的语言)。在以下代码中,第一个字符串位于 L(G) 中,但第二个字符串不在 L(G) 中。

    String [] stringArray = { "aaaaaabbbbbbaaabbbaaaaaabbbbbb",
                              "aaabbbaaaaaabbbbbbaaabbbb" } ;
    for ( int i = 0 ; i < stringArray.length ; i ++ )
      {
      CharStream charStream = CharStreams.fromString ( stringArray[i] ) ;
      GLexer lexer = new GLexer( charStream ) ;
      CommonTokenStream tokens = new CommonTokenStream( lexer ) ;
      GParser parser = new GParser( tokens ) ;
      ParseTree tree = parser.s() ;
      } // end for i loop

我希望代码能够打印诸如……

The string "aaaaaabbbbbbaaabbbaaaaaabbbbbb" is in L(G).

和……

The string "aaabbbaaaaaabbbbbbaaabbbb" is not in L(G).

如何以编程方式区分解析成功的字符串(并且位于L(G)中),以及无法成功解析的字符串(并且不在 L(G) 中)?



I am attempting to mimic the grammar G shown below using ANTLR v4.9.3

enter image description here

My attempt to do so is shown below …

grammar G ;
s : t s | ;
t : 'aaa' t 'bbb' |  ;

I invoke the ANTLR Tool as follows …

org.antlr.v4.Tool G.g4

The tool's response is …

The following sets of rules are mutually left-recursive [s]

My question is …

How does one create an ANTLR grammar for grammar G ?


In order to eliminate the errors, grammar G has been updated to …

grammar G ;
s : t* EOF ;
t : 'aaa' 'bbb' | 'aaa' t 'bbb' ;

I am also trying to programatically distinguish between strings that are in L(G), and strings that are not in L(G) (where L(G) is the language generated by grammar G). In the following code, the first string is in L(G), but the second string is not in L(G).

    String [] stringArray = { "aaaaaabbbbbbaaabbbaaaaaabbbbbb",
                              "aaabbbaaaaaabbbbbbaaabbbb" } ;
    for ( int i = 0 ; i < stringArray.length ; i ++ )
      {
      CharStream charStream = CharStreams.fromString ( stringArray[i] ) ;
      GLexer lexer = new GLexer( charStream ) ;
      CommonTokenStream tokens = new CommonTokenStream( lexer ) ;
      GParser parser = new GParser( tokens ) ;
      ParseTree tree = parser.s() ;
      } // end for i loop

I'd like the code to print messages such as …

The string "aaaaaabbbbbbaaabbbaaaaaabbbbbb" is in L(G).

… and …

The string "aaabbbaaaaaabbbbbbaaabbbb" is not in L(G).

How does one programmatically distinguish between strings that parse successfully (and are in L(G)), and strings that fail to parse successfully (and are not in L(G)) ?


如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文