(~('\r' | '\n' | ' <' |'>' | '=' | '!' | '&' | '|' | '@' ))+ 并没有排除空格,
a<c b>d被解析为(a) < (c b>d)吧

解决方案 »

  1.   

    我感觉不是这样的。首先最后一句话WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ { $channel = HIDDEN; } ; 已经忽略掉空格了,也就是说,在当前输入的字符中,空格是可以忽略的。此外,如果是解析成(a) < (c b>d)的形式,那么,这在解析过程中是按一个expression来处理的,那么,(c b>d)应该是这个表达式中的第二个STRING1,而STRING1中是不能有'>'的。此外,一个类似的问题,不过形式更加简单而已,请见http://alien1979.e34.163ns.com/BrowsePost.aspx?smallid=1&postid=128,是同样的问题。
      

  2.   

    感觉你的STRING1 这个rule有问题,把‘a <c b’整个当成了一个token。
    可以改成
    STRING1 : 'a'..'z' ; 
    再拓展它。
      

  3.   

    七楼,你好!‘a <c b’整个当成了一个token,感觉是不可能的,因为如果是那样的话,那么该token中就包含了字符'<',而在STRING1的定义中已经指出了该token中不包含'<'
      

  4.   

    楼主现在有啥好的资料学习ANTLR吗?偶也想入门啊
      

  5.   

    中文的资料可以看看网站www.antlr.org.cn,主人alien挺牛的,他写了一个中文版的书,还没写完,可以到上面找找!
    至于学习,也可以看ANTLR的官方网站,该软件也有一本对应的书,英文版的,可以从网上下载。