我正在嘗試為 IBM 匯編語言撰寫決議器,示例如下。
注釋行的第一個字符以星號* 開頭,但是有兩個問題
除了行中的設定點之外,還可以有描述性文本,但不需要星號*。
描述性可以/確實包含詞法分析器標記,例如 ENTRY 或 INPUT .....
* TYPE. ARG DSECT NXENT DS F some comment text ENTRY NUMBER NMADR DS F some comment text INPUT NAME NAADR DS F some comment text NATYP DS F some comment text NAENT DS F some comment text ORG NATYP some comment text
在我的詞法分析器中,我設計了以下內容,絕對可以正常作業:
fragment CommentLine: Star {getCharPositionInLine() == 1}? .*? Nl
;
fragment Star: '*';
fragment Nl: '\r'? '\n' ;
COMMENT_LINE
: CommentLine -> channel (COMMENT)
;
我的問題是如何管理從決議器語法中的特定字符位置開始的行注釋?即決議器-> NAME DS INT?信 ??????????
uj5u.com熱心網友回復:
將評論發送到COMMENT頻道(或對其進行-> skip處理)是一種用于避免必須在決議器規則中定義評論有效的所有位置的技術。
(老 360 匯編程式員在這里)
由于沒有真正的方法可以在 Assembler 源代碼中放置任意位置的注釋,因此您實際上不需要處理將它們分流到一邊的問題。實際上,由于在匯編源代碼中處理注釋的方式,沒有一種方法可以在 Lexer 規則中識別它們。
由于它可以是決議器規則,因此您可以設定如下規則:
trailingComment: (ID | STRING | NUMBER)* EOL;
其中ID, STRING,NUMBER等只是您的詞法分析器中的標記(您需要包含幾乎所有這些標記……一個很好的論據,因為不要深入到MVC, CLC, CLI, 的標記(所有操作碼...瘋狂之路。當然,EOL 是匹配行尾的規則(可能'\r?\n')
然后,您將結束用于決議包含尾隨注釋(幾乎所有注釋)的行的每個trailingComment規則。
uj5u.com熱心網友回復:
在發表我的帖子之前,我正沿著 Mike Lischke 描述的道路前進,我之前也偶然發現了您提到的技術,但我想我會征求其他意見。老實說,我更喜歡你的方法,因為我會利用語法訪問者和聽眾事件的優勢。我希望語法師具有一定程度的智能,但 MikeL 的分塊技術將智能放入應用程式中,除非我誤解了?
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/383598.html
