标签: javacc

使用ANT,Javacc,JUnit和编译Java类加快Linux构建时间的技巧

我们有一个大型代码库,在开发人员机器上大约需要12分钟,使用JavaCC自动生成一些Java 5类,然后编译所有类以及运行单元测试.

该项目由多个项目组成,可以分组建立,但我们的目标是在10分钟内完成整个项目

有什么提示可以减少这个构建时间?

谢谢

java linux ant junit javacc

5
推荐指数
1
解决办法
3852
查看次数

Java,JavaCC:如何解析BMP之外的字符?

我指的是XML 1.1规范.

看看定义NameStartChar:

NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]

如果我正确地解释了这一点,那么最后一个range(#x10000-#xEFFFF)超出了Java 类型的UTF16范围char.所以一定是UTF32,对吧?所以,我需要检查对char这个范围的对,而不是单个chars,对吧?

我的问题是:

  • 如何使用标准Java方法检查此类字符范围?
  • 如何在JavaCC中定义这样的范围?
    • JavaCC抱怨\u10000\uEFFFF

谢谢!

注意: 别担心,我不是在尝试编写自己的XML解析器.
编辑: 我正在编写一个解析器,它将检查来自其他(非XML)文本格式的文本输入是否与有效的XML名称匹配.

java unicode javacc utf-16

5
推荐指数
1
解决办法
1300
查看次数

在词法状态中使用"〜[]"标记

我正在尝试编写一个基于javacc的解析器,它涉及以下标记/词法状态:

TOKEN :
{
  <"{"> : FIRST
}
<FIRST, DEFAULT> TOKEN :
{
  <"~[]"> : DEFAULT
}
Run Code Online (Sandbox Code Playgroud)

试图解析"{;}"会导致词法错误

遇到:";" (59),之后:""

我不明白.我可以通过两种方式避免错误:

  • 通过显式";"替换"〜[]"模式 文字
  • 通过删除FIRST词汇状态

但是,我确实需要这两个(你可以猜到,上面只是一个最小的测试用例),所以这不是一个合适的解决方法.知道上面的标记定义有什么问题吗?

谢谢 !

javacc

5
推荐指数
1
解决办法
73
查看次数

如何匹配JavaCC中的可选开/关标签?

什么JavaCC语法实现了可以解析这些行的语法:

[b]content[/b]
content[/b]
[b]content
Run Code Online (Sandbox Code Playgroud)

尽管JavaCC解析器需要解析所有行,但它必须区分正确和错误的标记行为.

正确的标签就像第一行,它们有一个打开和关闭的标签.当标签匹配时,这将输出粗体格式化文本.

不正确的标签就像第2行和第3行一样,它们没有匹配的打开或关闭标签.当这些发生时,它们按原样写入输出,不会被解释为标记.

我已经尝试过下面的JavaCC代码(LOOKAHEAD = 999999).问题是,这种语法总是将所有内容都匹配为invalidTag()而不是bold().如何确保JavaCC解析器尽可能匹配bold()

String parse() :
{}
{
    body() <EOF>
    { return buffer; }
}

void body() :
{}
{
    (content())*
}

void content() :
{}
{ 
    (text()|bold()|invalidTag)
}

void bold() :
{}
{
    { buffer += "<b>";  }
    <BOLDSTART>(content())*<BOLDEND>
    { buffer += "</b>"; }
}

void invalidTag() :
{
}
{
    <BOLDSTART> | <BOLDEND>
    { // todo: just output token
    }
} …
Run Code Online (Sandbox Code Playgroud)

java parsing javacc bbcode

4
推荐指数
1
解决办法
1283
查看次数

处理语法歧义(扑克文件解析)

我目前正在制作一个扑克手历史解析器,作为我的单身汉项目的一部分.我过去几天一直在做一些研究,并遇到了一些不错的解析器生成器(其中我选择了JavaCC,因为项目本身将用Java编码).

尽管手历史语法非常基本且直截了当,但由于玩家昵称中允许的一组字符存在歧义问题.

假设我们有一个以下格式的行:

Seat 5: myNickname (1500 in chips)
Run Code Online (Sandbox Code Playgroud)

令牌myNickname可以包含任何字符以及空格.这意味着,这两个(1500 in chipSeat 5:有效的绰号-这最终导致的模糊问题.除了长度(4-12个字符)之外,对玩家的昵称没有限制.

我需要解析并存储几个数据以及玩家的昵称(例如在这种特殊情况下的座位位置和筹码数量),所以我的问题是,我在这里有什么选择?

我很乐意使用JavaCC来做这件事:

SeatRecord seat() :
{ Token seatPos, nickname, chipStack; }
{
    "Seat" seatPos=<INTEGER> ":" nickname=<NICKNAME> "(" chipStack=<INTEGER> 
    "in chips)"
    {
        return new SeatRecord(seatPos.image, nickname.image, chipStack.image); 
    }
}  
Run Code Online (Sandbox Code Playgroud)

现在哪个不起作用(由于上述问题)

我还搜索了GLR解析器(显然处理了暧昧的语法) - 但是除了Bison之外,它们似乎大多被放弃或记录不佳,但是它不支持Java的GLR解析器,并且可能太复杂而无法使用anway(除了歧义问题,语法本身是非常基本的,正如我所提到的)

或者我应该坚持自己标记字符串,并使用indexOf(), lastIndexOf()等来解析我需要的数据?只有当它是剩下的唯一选择时我才会这样做,因为它太丑了恕我直言,我可能会错过一些情况(这会导致错误的解析)

java parsing javacc ambiguity

4
推荐指数
1
解决办法
392
查看次数

单行排序偶数和奇数

这是一个面试问题.

假设你有这样的数组

{54,23,545,65,23,4,1,2,5}
Run Code Online (Sandbox Code Playgroud)

如何对它进行排序并在一行代码中将其分类为偶数或奇数?

答案的复杂性顺序应为O(1),不使用任何for循环.结果应该是:

{2,4,54,1,5,23,23,65,545}
Run Code Online (Sandbox Code Playgroud)

java collections javacc java-ee java-ee-5

4
推荐指数
1
解决办法
845
查看次数

如何在 Windows 10 中设置 Javacc

是否有任何明确的教程或信息可以在 windows10 中安装 javacc?

我访问了https://javacc.github.io/javacc/但没有明确的说明在 Windows 上设置它。

请帮我。

java parsing javacc lexer

4
推荐指数
1
解决办法
1903
查看次数

带有转义字符的JavaCC引用

标记可包含转义字符的引用字符串的常用方法是什么?这里有些例子:

1) "this is good"
2) "this is\"good\""
3) "this \is good"
4) "this is bad\"
5) "this is \\"bad"
6) "this is bad
7)  this is bad"
8)  this is bad
Run Code Online (Sandbox Code Playgroud)

下面是一个不能正常工作的示例解析器; 除了成功解析的示例4和5之外,它具有预期的结果.

options
{
  LOOKAHEAD = 3;
  CHOICE_AMBIGUITY_CHECK = 2;
  OTHER_AMBIGUITY_CHECK = 1;
  STATIC = false;
  DEBUG_PARSER = false;
  DEBUG_LOOKAHEAD = false;
  DEBUG_TOKEN_MANAGER = true;
  ERROR_REPORTING = true;
  JAVA_UNICODE_ESCAPE = false;
  UNICODE_INPUT = false;
  IGNORE_CASE = false;
  USER_TOKEN_MANAGER = false;
  USER_CHAR_STREAM = false;
  BUILD_PARSER = true;
  BUILD_TOKEN_MANAGER = …
Run Code Online (Sandbox Code Playgroud)

java quotes parsing escaping javacc

3
推荐指数
1
解决办法
1595
查看次数

定义标记以匹配任何字符串

我是 javacc 新手。我正在尝试定义一个可以匹配任何字符串的标记。我遵循的正则表达式语法<ANY: (~[])+>不起作用。我想要实现一些非常简单的事情,定义一个具有以下 BNF 的表达式:

<exp> ::= "path(" <string> "," <number> ")"
Run Code Online (Sandbox Code Playgroud)

我当前的 .jj 文件如下,有关如何解析字符串的任何帮助:

options
{
}
PARSER_BEGIN(SimpleAdd)
package SimpleAddTest;
public class SimpleAdd
{
}
PARSER_END(SimpleAdd)
SKIP :
{
    " "
|   "\r"
|   "\t"
|   "\n"
}
TOKEN:
{
    < NUMBER: (["0"-"9"])+  > |
    <PATH: "path"> |
    <RPAR: "("> |
    <LPAR: ")"> |
    <QUOTE: "'"> |
    <COMMA: ","> |
    <ANY: (~[])+>


}

int expr():
{
    String leftValue ;
    int rightValue ;
}
{

        <PATH> <RPAR> …
Run Code Online (Sandbox Code Playgroud)

javacc

3
推荐指数
1
解决办法
1802
查看次数

JavaCC 中的多行注释

我正在尝试使用 JavaCC 制作 Javascript 扫描器。我有几个问题,其中之一是 C 风格的注释:/* \xe2\x80\xa6 */我需要将注释作为标记返回。

\n\n

这是一种尝试:

\n\n
TOKEN: {<MLCOMMENT:          "/*"        ( ~["*"] | ("*"(~["/"])?) )* "*/">}\nTOKEN: {<MLCOMMENT_UNDELIM: ("/*"|"/*/") ( ~["/"] | (~["*"]"/")    )*     >}\n
Run Code Online (Sandbox Code Playgroud)\n\n

MLCOMMENT 旨在匹配封闭式评论和 MLCOMMENT_UNDELIM 开放式评论。这不起作用,因为/*a*/b*/与 MLCOMMENT 的匹配比/*a*/.

\n\n

这是解决此问题的另一种尝试:

\n\n
MORE:\n{\n    "/*" : WithinMLComment\n}\n< WithinMLComment > TOKEN :\n{\n    < MLCOMMENT: "*/" > : DEFAULT\n}\n< WithinMLComment > MORE :\n{\n    < ~[] >\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这也不起作用,因为开放式注释会导致 WithinMLComment 状态出现 EOF。这是非法的(抛出 TokenMgrError )。

\n\n

更新: \n我可能找到了解决方案:

\n\n
TOKEN: {<MLCOMMENT:         ("/*"|"/*/") …
Run Code Online (Sandbox Code Playgroud)

java regex comments javacc

2
推荐指数
1
解决办法
2162
查看次数