Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Jison:获取解析的标记,而不是语法中定义的标记_Javascript_Parsing_Grammar_Ebnf_Jison - Fatal编程技术网

Javascript Jison:获取解析的标记,而不是语法中定义的标记

Javascript Jison:获取解析的标记,而不是语法中定义的标记,javascript,parsing,grammar,ebnf,jison,Javascript,Parsing,Grammar,Ebnf,Jison,我试图生成一个与配方成分相关的解析器。我注意到解析器处理标记的顺序似乎遵循jison文件中标记的行项顺序,而不是EBNF语法中定义的顺序 例如,分析6汤匙的无盐黄油,切成1英寸的小块,得到: 我希望语法在它吃掉一个单词之前能看到单位的名称,即汤匙。这里正确的语法方法是什么?我一直在使用验证语法状态,到目前为止没有看到任何错误 吉森语法 主旨 我用一些文本字符串和一个简单的解析器创建了一个测试: 在正则表达式中,[]和有很大区别。@rici输入错误捕捉很好,但仍然无法正确解析。我将[]替换为。它或

我试图生成一个与配方成分相关的解析器。我注意到解析器处理标记的顺序似乎遵循jison文件中标记的行项顺序,而不是EBNF语法中定义的顺序

例如,分析6汤匙的无盐黄油,切成1英寸的小块,得到:

我希望语法在它吃掉一个单词之前能看到单位的名称,即汤匙。这里正确的语法方法是什么?我一直在使用验证语法状态,到目前为止没有看到任何错误

吉森语法 主旨 我用一些文本字符串和一个简单的解析器创建了一个测试:

在正则表达式中,[]和有很大区别。@rici输入错误捕捉很好,但仍然无法正确解析。我将[]替换为。它或多或少对我有用。我将UnitName改为teaspoon | teaspoons |…\b,尽管这不是必需的,也不是好的样式,然后成功地解析了6汤匙黄油,切成小块。当然,你不能解析6汤匙的黄油,切成1英寸的小块,因为1是一个数字,而-是一个字符,这两个在配料信息中都无效
Error: Parse error on line 1:
6 tablespoons unsalted
--^
Expecting 'UNIT_NAME', 'NUMBER', 'SLASH', got 'WORD'
%lex
%options flex case-insensitive

UnitName                    [teaspoons|teaspoon|tablespoons|tablespoon|fluid ounces|fluid ounce|ounces|ounce|cups|cup|pints|pint|quarts|quart|gallons|gallon|pounds|pound|milliliters|milliliter|deciliters|deciliter|liters|liter]\b
Word                        \w+\b
NUMBER                      [1-9][0-9]+|[0-9]
CHAR                        [a-zA-Z0-9_-]

%%

\s+                      /* skip whitespace */
{NUMBER}                 return 'NUMBER'
{UnitName}               return "UNIT_NAME";
{Word}                   return 'WORD'
{CHAR}                   return 'CHAR'
"/"                      return "SLASH";
"-"                      return "HYPHEN"
","                      return "COMMA";
<<EOF>>                  return 'EOF';

/lex

/* enable EBNF grammar syntax */
%ebnf

/* language grammar */
%start ingredient
%%

ingredient
    : ingredient_format
        { return $1; }
    ;

ingredient_format
    : unit_count UNIT_NAME ingredient_name COMMA ingredient_info EOF
        { $$ = {'count': $1, 'unit': $2, 'item': $3, info: $5}; }
    | unit_count UNIT_NAME ingredient_name EOF
        { $$ = {'count': $1, 'unit': $2, 'item': $3, info: null}; }
    ;

unit_count
    : NUMBER
        { $$ = parseInt($1); }
    | NUMBER SLASH NUMBER
        { $$ = parseInt($1) / parseInt($3); }
    | NUMBER NUMBER SLASH NUMBER
        { $$ = parseInt($1) + (parseInt($2) / parseInt($4)); }
    ;

ingredient_name
    : WORD+
        { $$ = $1; }
    ;

ingredient_info
    : ""
        { $$ = ''; }
    | WORD+
        { $$ = $1; }
    ;