1
我是antlr4的新手,儘管感動了antlr3年前。我在這裏有這個JavaScript語法文件,它認爲break語句是表達式語句,而break語句是在前面定義的。規則優先級如何工作?語法規則優先級如何工作?
這裏是我的語法文件:
問題是與語句解析。當它看到break語句
break;
它解析它作爲表達式語句。因此,下面的單元測試失敗,現在被標記爲忽略:
我是antlr4的新手,儘管感動了antlr3年前。我在這裏有這個JavaScript語法文件,它認爲break語句是表達式語句,而break語句是在前面定義的。規則優先級如何工作?語法規則優先級如何工作?
這裏是我的語法文件:
問題是與語句解析。當它看到break語句
break;
它解析它作爲表達式語句。因此,下面的單元測試失敗,現在被標記爲忽略:
如何進行規則優先工作?
它按照您的想法工作:規則中的替代項按照它們定義的順序進行匹配。
真正的問題是因爲您在之前定義了IDENTIFIER
規則您的關鍵字規則。因此,輸入'break'
被標記爲IDENTIFIER
,因此匹配爲primaryExpression
。
解決方法很簡單:將IDENTIFIER
規則後關鍵字的規則:
// Keywords VAR: 'var'; IF: 'if'; WHILE: 'while'; DO: 'do'; FOR: 'for'; CONTINUE: 'continue'; BREAK: 'break'; RETURN: 'return'; FUNCTION: 'function'; NEW: 'new'; DELETE: 'delete'; IN: 'in'; INSTANCEOF: 'instanceof'; IDENTIFIER : [a-zA-Z$_] [a-zA-Z0-9$_]* ;
太感謝你了,巴特!它解決了確切的問題! –
很高興聽到@FrankDu,不客氣。 –