你絕對可以做這樣的事情,但顯然它會破壞源代碼的直觀性。想象一下:
if if == 1
就實際執行它而言,詞法分析器根本不需要改變。如果詞法分析器在源中匹配「if」,它會返回一個帶有IF
類型的標記。假設我們有以下的賦值語句,將if
是一個變量名,它越來越賦值爲1
if <- 1;
詞法分析器的令牌流被送進分析器是:
IF, LARROW, INTLITERAL, SEMICOLON
我可能有下列作品描述的賦值語句(\ W整數rvals):
assignStmt::= id:i LARROW intExpr:e SEMICOLON {: RESULT = new AssignmentStatement(i, e) :}
intExpr::= INTLITERAL:i {: RESULT = i.intVal; :}
id::= ID:i {: RESULT = i.strVal; :}
LARROW
,ID
, IF
,INTLITERAL
和SEMICOLON
是終端,它們是詞法分析器返回的令牌,並且assignStmt
,id
和intExpr
是非終端。 ID
代表一個標識符(例如類別/變量/方法名稱)。
在if語句生產失敗後,我們最終會輸入賦值語句的第一個生成語句。我們擴大id
非終端,其唯一生產是ID
,但我想匹配的令牌是IF
,所以assignStmt
生產完全失敗。
對於我的語言,讓一個變量被命名爲「如果」所有我需要做的就是:
assignStmt::= id:i LARROW intExpr:e SEMICOLON {: RESULT = new AssignmentStatement(i, e) :}
intExpr::= INTLITERAL:i {: RESULT = i.intVal; :}
id::= ID:i {: RESULT = i.strVal; :}
|IF {: RESULT = "if"; :}
注意|
定義的非終端的替代產品。現在我們爲id
非終端進行第二次生產,它與當前令牌匹配,並最終導致與賦值語句匹配。
AssignmentStatement
被定義爲AST節點如下:
class AssignmentStatement {
String varName;
int intVal;
AssignmentStatement(String s, int i){varName = s; intVal = i; }
}
一旦解析器決定源是語法正確的,不應該有其他的影響。變量的名稱不應該影響編譯的後期階段,也就是說,如果您不創建允許發生這種情況的條件。
這樣的erm能力不僅會讓編譯器「迷惑」,而且會讓人們用這種語言閱讀代碼。那爲什麼放棄這個呢? – kirilloid 2012-04-15 23:54:19