- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果可能,我的 void decleration() 应该根据图像解析字符串输入。
SKIP :
{
< " " | "\t" | "\r" | "\n" | "\r\n" >
| <"//" (~["\n","\r"])* ("\n"|"\r"|"\r\n") >
| <"/*"(~["/"])* "*""/" >
}
TOKEN : { < VAR: "VAR" > }
TOKEN : { < AS: "AS" >}
TOKEN : /* KEYWORDS */
{
< TYPE: "INT"| "BOOL"|"FLOAT" >
}
TOKEN :
{
< EQUALS: "=" >
}
TOKEN:
{
< PLUS : "+" >|< MINUS :"-" >|< MUL: "*" >|< DIV: "/" >|< COMM: ",">
}
TOKEN:
{
< VARIABLE: (["a"-"z", "A"-"Z", "0"-"9"])+ >
}
void decleration(): {} { <VAR> (<VARIABLE>|< COMM >|<EQUALS>)+ <AS> <TYPE>}
我还是 JavaCC 的新手,所以请原谅我的代码不好,我在哪里可以找到一些使用 JavaCC 制作自定义编译器的资源。
谢谢。
最佳答案
有教程here .
要解析您在问题中给出的示例,您需要:
TYPE
中添加“CHAR”,VARIABLE
中添加“_”。实际上我会重写它,因为它也接受整数。我会做这样的事情:TOKEN:
{
< VARIABLE: <LETTER>(<LETTER>|<DIGIT>)* >
| < #LETTER: ["a"-"z", "A"-"Z", "_"] >
| < #DIGIT: ["0"-"9"] >
}
void input(): {} { (declaration())* }
TOKEN:
{
< INT_VALUE: (<DIGIT>)+ >
| < FLOAT_VALUE: <INT_VALUE> "." (<DIGIT>)* | "." (<DIGIT>)+ >
| < CHAR_VALUE: "\'" (~["\'","\\"]|<ESCAPE>) "\'" >
| < STRING_VALUE: "\"" (~["\'","\\"]|<ESCAPE>)* "\"" >
| < #ESCAPE: "\\" ["n","t","b","r","f","\\","\"","\'"] >
}
void varDeclaration(): {} { <VARIABLE> (<EQUALS> literalValue())? }
void literalValue(): {} { <INT_VALUE> | <FLOAT_VALUE> | <CHAR_VALUE> | <STRING_VALUE> }
声明规则变为:
void declaration(): {} { <VAR> varDeclaration() (< COMM > varDeclaration())* <AS> <TYPE>}
请注意,当您跳过行尾字符时,没有什么可以阻止在同一行上出现多个声明。
生成的文件如下所示:
options {
STATIC = false;
OUTPUT_DIRECTORY = "src/parser";
}
PARSER_BEGIN(Parser)
package parser;
public class Parser {
public void parse() throws ParseException {
input();
}
}
PARSER_END(Parser)
SKIP :
{
< " " | "\t" | "\r" | "\n" | "\r\n" >
| <"//" (~["\n","\r"])* ("\n"|"\r"|"\r\n") >
| <"/*"(~["/"])* "*""/" >
}
TOKEN : { < VAR: "VAR" > }
TOKEN : { < AS: "AS" >}
TOKEN : /* KEYWORDS */
{
< TYPE: "INT" | "BOOL" | "FLOAT" | "CHAR" >
}
TOKEN :
{
< EQUALS: "=" >
}
TOKEN:
{
< PLUS : "+" >|< MINUS :"-" >|< MUL: "*" >|< DIV: "/" >|< COMM: ",">
}
TOKEN:
{
< VARIABLE: <LETTER>(<LETTER>|<DIGIT>)* >
| < #LETTER: ["a"-"z", "A"-"Z", "_"] >
| < #DIGIT: ["0"-"9"] >
}
TOKEN:
{
< INT_VALUE: (<DIGIT>)+ >
| < FLOAT_VALUE: <INT_VALUE> "." (<DIGIT>)* | "." (<DIGIT>)+ >
| < CHAR_VALUE: "\'" (~["\'","\\"]|<ESCAPE>) "\'" >
| < STRING_VALUE: "\"" (~["\'","\\"]|<ESCAPE>)* "\"" >
| < #ESCAPE: "\\" ["n","t","b","r","f","\\","\"","\'"] >
}
void input(): {} { (declaration())* }
void varDeclaration(): {} { <VARIABLE> (<EQUALS> literalValue())? }
void literalValue(): {} { <INT_VALUE> | <FLOAT_VALUE> | <CHAR_VALUE> | <STRING_VALUE> }
void declaration(): {} { <VAR> varDeclaration() (< COMM > varDeclaration())* <AS> <TYPE>}
更新
添加正文部分;据我所知,输入是一个声明列表,后跟一个正文:
void input(): {} { (declaration())* body() }
body 规则是这样的:
void body(): {} { <START> (statement())* <STOP> }
您还需要一些标记:关键字“START”、“STOP”、“OUTPUT”、“AND”、“OR”、“NOT”、运算符“:”、“&”、“(”、“) "等等...
我看到两种类型的语句:赋值语句和输出语句:
void statement(): {} { assignment() | output() }
void assignment(): {} { <VARIABLE> <EQUALS> expression() }
void output(): {} { <OUTPUT> <COLON> expression() }
它们都需要表达式的规则。它可能看起来像这样:
void expression(): {} { comparison() (logicalOp() comparison())* }
void logicalOp(): {} { <AND> | <OR> }
void comparison(): {} { simpleExpression() ( comparisonOp() simpleExpression() )? }
void comparisonOp(): {} { <LT> | <GT> | <LE> | <GE> | <EQ> | <NE> }
void simpleExpression(): {} { term() ( addOp() term() )* }
void addOp(): {} { <PLUS> | <MINUS> | <CAT> }
void term(): {} { factor() ( mulOp() factor() )* }
void mulOp(): {} { <MUL> | <DIV> | <MOD> }
void factor(): {} {
(<PLUS>|<MINUS>) factor()
| <LPAR> expression() <RPAR>
| <NOT> expression()
| <VARIABLE>
| literalValue()
}
综合起来:
options {
STATIC = false;
OUTPUT_DIRECTORY = "src/parser";
}
PARSER_BEGIN(Parser)
package parser;
public class Parser {
public void parse() throws ParseException {
input();
}
}
PARSER_END(Parser)
SKIP :
{
< " " | "\t" | "\r" | "\n" | "\r\n" >
| <"//" (~["\n","\r"])* ("\n"|"\r"|"\r\n") >
| <"/*"(~["/"])* "*""/" >
}
TOKEN : { < VAR: "VAR" > }
TOKEN : { < AS: "AS" >}
TOKEN : { < START: "START" > | < STOP: "STOP" > | < OUTPUT: "OUTPUT" > }
TOKEN : /* KEYWORDS */
{
<INT: "INT">|<BOOL:"BOOL">|<FLOAT:"FLOAT">|<CHAR:"CHAR">
|<AND: "AND"> | <OR: "OR"> | <NOT: "NOT">
}
TOKEN :
{
< EQUALS: "=" > | < COLON: ":" > | <LPAR: "(">|<RPAR: ")">
}
TOKEN:
{
< PLUS : "+" >|< MINUS :"-" >|< MUL: "*" >|< DIV: "/" >|< MOD: "%" >|< COMM: ",">
|<LT: "<">|<GT: ">">|<LE: "<=">|<GE: ">=">|<EQ: "==">|<NE: "<>">
|<CAT: "&">
}
TOKEN:
{
< VARIABLE: <LETTER>(<LETTER>|<DIGIT>)* >
| < #LETTER: ["a"-"z", "A"-"Z", "_"] >
| < #DIGIT: ["0"-"9"] >
}
TOKEN:
{
< INT_VALUE: (<DIGIT>)+ >
| < FLOAT_VALUE: <INT_VALUE> "." (<DIGIT>)* | "." (<DIGIT>)+ >
| < CHAR_VALUE: "\'" (~["\'","\\"]|<ESCAPE>) "\'" >
| < STRING_VALUE: "\"" (~["\"","\\"]|<ESCAPE>)* "\"" >
| < #ESCAPE: "\\" ["n","t","b","r","f","\\","\"","\'"] >
}
void input(): {} { (declaration())* body() }
void varDeclaration(): {} { <VARIABLE> (<EQUALS> literalValue())? }
void literalValue(): {} { <INT_VALUE> | <FLOAT_VALUE> | <CHAR_VALUE> | <STRING_VALUE> }
void declaration(): {} { <VAR> varDeclaration() (<COMM> varDeclaration())* <AS> type()}
void type(): {} {<INT>|<FLOAT>|<BOOL>|<CHAR>}
void body(): {} { <START> (statement())* <STOP> }
void statement(): {} { assignment() | output() }
void assignment(): {} { <VARIABLE> <EQUALS> expression() }
void output(): {} { <OUTPUT> <COLON> expression() }
void expression(): {} { comparison() (logicalOp() comparison())* }
void logicalOp(): {} { <AND> | <OR> }
void comparison(): {} { simpleExpression() ( comparisonOp() simpleExpression() )? }
void comparisonOp(): {} { <LT> | <GT> | <LE> | <GE> | <EQ> | <NE> }
void simpleExpression(): {} { term() ( addOp() term() )* }
void addOp(): {} { <PLUS> | <MINUS> | <CAT> }
void term(): {} { factor() ( mulOp() factor() )* }
void mulOp(): {} { <MUL> | <DIV> | <MOD> }
void factor(): {} {
(<PLUS>|<MINUS>) factor()
| <LPAR> expression() <RPAR>
| <NOT> expression()
| <VARIABLE>
| literalValue()
}
关于JavaCC - 简单表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48679008/
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我是第一次使用 JavaCC,我注意到它生成了大量死代码。有很多行看起来像(请原谅间距,它是自动的): {if ("" != null) return result;} throw new E
在 JavaCC 中,如何定义由重复字符组成的标记,如下例所示: "..." what would correspond to TOKEN : { TripleDot : "..." } 或 "::"
根据JavaCC documentation ,如果我想自定义词法分析器中错误给出的消息: To customize error reporting by the lexer, the lexer c
我正在尝试创建一个包含所有函数名称的映射。我可以在扫描阶段或解析阶段执行此操作,但似乎无法获得两者都可以访问的相同变量。 我需要的是在开始解析之前将所有函数名称保存在映射中,因为函数可以在其调用点下方
我有以下javacc语法。 规则UnaryExpr创建了一些实现java.util.function.Predicate<>的匿名类。 options { static=false; DEBUG_PA
如果可能,我的 void decleration() 应该根据图像解析字符串输入。 SKIP : { | | } TOKEN : { } TOKEN : { } TOKEN : /* KEYW
我目前正在为我的语法开发一个解析器。我的目标是在没有前瞻的情况下实现它,而这正是我真正正在努力解决的问题。 这是一个缩小的示例,我相信它足以证明我遇到的问题。 void main() : {} {
我使用这个语法来计算数学表达式: // Konfiguration (JavaCC-Manual konsultieren) options { STATIC = true; // a
我们正在使用 javacc 实现一个版本的乱码来构建我们的抽象语法树。我们有许多用 java 实现的类,由我们的 Parser.jj 程序调用。但是,Parser.jj 无法识别任何已实现的类,即使它
我正在尝试为这样的源代码创建一个解析器: [code table 1.0] code table code_table_name id = 500 desc = "my code ta
我的语法如下: PARSER_BEGIN(Parser) package parser; public class Parser {} PARSER_END(Parser) SKIP:
我正在尝试使用 javacc 创建一阶逻辑解析器,但遇到以下问题。 我有这个: ()* > 哪里 | | | ) > ,但我想从中排除一些词。特别是我想排除单词 sum、count、a
我需要使用 javaCC 来解析数据文件,例如: //This is comment to skip //This is also comment to skip //student Table Be
我是 JavaCC 的新手,无法弄清楚如何让它运行。我使用的是 Mac OS X,我安装了 javacc-6.0.zip 并解压了它。在键入 javacc 时,我无法从我的路径访问 javacc 脚本
我有一个语法,我必须使用 JJTree 和 JavaCC 来创建一个符号表和一个 AST。虽然我完全理解创建表和树的作业部分,但给我的语法含糊不清,包含左递归和间接左递归。它也需要留下因素。我在整个互
在我的语法中,有最初包含间接左递归的表达式和片段的产生规则。这是我删除了递归之后的规则。 String expression() #Expression : {String number; Token
匹配 任何内容 的正则表达式是什么,除了这些字符串: =>, | ? 如果您熟悉 javacc,我正在尝试定义我的 ANYTHING 标记,如下所示: TOKEN : { " > | | |
所以我是 JavaCC 的初学者,我只想在没有重复项的情况下接受这个字符串。因此,如果输入如下: A B C A' B' C' A'' B'' C'' 只有当`B != B' != B''时解析器才会
我已经为此困惑了好几天,搜索似乎没有给出任何结果。让我想知道这是否可能。例如: funct functionNAME (Object o) { o+1 }; 重点是用户必须在大括号内使用标识符“o”,
我是一名优秀的程序员,十分优秀!